¿Cómo implementar relaciones uno a uno, uno a muchos y muchos a muchos al diseñar tablas?
¿Alguien puede explicar cómo implementar relaciones uno a uno, uno a muchos y muchos a muchos mientras se diseñan tablas con algunos ejemplos?
Uno a uno: utilice una clave externa para la tabla a la que se hace referencia:
student: student_id, first_name, last_name, address_id
address: address_id, address, city, zipcode, student_id # you can have a
# "link back" if you need
También debe poner una restricción única en la columna de clave externa ( addess.student_id
) para evitar que varias filas en la tabla secundaria ( address
) se relacionen con la misma fila en la tabla a la que se hace referencia ( student
).
Uno a muchos : utilice una clave externa en el lado muchos de la relación que enlaza con el lado "uno":
teachers: teacher_id, first_name, last_name # the "one" side
classes: class_id, class_name, teacher_id # the "many" side
Muchos a muchos : utilice una tabla de unión ( ejemplo ):
student: student_id, first_name, last_name
classes: class_id, name, teacher_id
student_classes: class_id, student_id # the junction table
Consultas de ejemplo:
-- Getting all students for a class:
SELECT s.student_id, last_name
FROM student_classes sc
INNER JOIN students s ON s.student_id = sc.student_id
WHERE sc.class_id = X
-- Getting all classes for a student:
SELECT c.class_id, name
FROM student_classes sc
INNER JOIN classes c ON c.class_id = sc.class_id
WHERE sc.student_id = Y
A continuación se muestran algunos ejemplos del mundo real de los tipos de relaciones:
Uno a uno (1:1)
Una relación es uno a uno si y sólo si un registro de la tabla A está relacionado con un máximo de un registro en la tabla B.
Para establecer una relación uno a uno, la clave principal de la tabla B (sin registros huérfanos) debe ser la clave secundaria de la tabla A (con registros huérfanos).
Por ejemplo:
CREATE TABLE Gov(
GID number(6) PRIMARY KEY,
Name varchar2(25),
Address varchar2(30),
TermBegin date,
TermEnd date
);
CREATE TABLE State(
SID number(3) PRIMARY KEY,
StateName varchar2(15),
Population number(10),
SGID Number(4) REFERENCES Gov(GID),
CONSTRAINT GOV_SDID UNIQUE (SGID)
);
INSERT INTO gov(GID, Name, Address, TermBegin)
values(110, 'Bob', '123 Any St', '1-Jan-2009');
INSERT INTO STATE values(111, 'Virginia', 2000000, 110);
Uno a muchos (1:M)
Una relación es de uno a muchos si y sólo si un registro de la tabla A está relacionado con uno o más registros de la tabla B. Sin embargo, un registro de la tabla B no puede estar relacionado con más de un registro de la tabla A.
Para establecer una relación de uno a muchos, la clave principal de la tabla A (la tabla "uno") debe ser la clave secundaria de la tabla B (la tabla "muchos").
Por ejemplo:
CREATE TABLE Vendor(
VendorNumber number(4) PRIMARY KEY,
Name varchar2(20),
Address varchar2(20),
City varchar2(15),
Street varchar2(2),
ZipCode varchar2(10),
Contact varchar2(16),
PhoneNumber varchar2(12),
Status varchar2(8),
StampDate date
);
CREATE TABLE Inventory(
Item varchar2(6) PRIMARY KEY,
Description varchar2(30),
CurrentQuantity number(4) NOT NULL,
VendorNumber number(2) REFERENCES Vendor(VendorNumber),
ReorderQuantity number(3) NOT NULL
);
Muchos a muchos (M:M)
Una relación es de muchos a muchos si y sólo si un registro de la tabla A está relacionado con uno o más registros de la tabla B y viceversa.
Para establecer una relación de muchos a muchos, cree una tercera tabla llamada "ClassStudentRelation" que tendrá las claves principales tanto de la tabla A como de la tabla B.
CREATE TABLE Class(
ClassID varchar2(10) PRIMARY KEY,
Title varchar2(30),
Instructor varchar2(30),
Day varchar2(15),
Time varchar2(10)
);
CREATE TABLE Student(
StudentID varchar2(15) PRIMARY KEY,
Name varchar2(35),
Major varchar2(35),
ClassYear varchar2(10),
Status varchar2(10)
);
CREATE TABLE ClassStudentRelation(
StudentID varchar2(15) NOT NULL,
ClassID varchar2(14) NOT NULL,
FOREIGN KEY (StudentID) REFERENCES Student(StudentID),
FOREIGN KEY (ClassID) REFERENCES Class(ClassID),
UNIQUE (StudentID, ClassID)
);
Uno a muchos
La relación de tabla de uno a muchos tiene el siguiente aspecto:
En un sistema de base de datos relacional, una relación de tabla de uno a muchos vincula dos tablas en función de una Foreign Key
columna del elemento secundario que hace referencia a la Primary Key
fila de la tabla principal.
En el diagrama de tabla anterior, la post_id
columna de la post_comment
tabla tiene una Foreign Key
relación con la columna post
de identificación de la tabla :Primary Key
ALTER TABLE
post_comment
ADD CONSTRAINT
fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
Cara a cara
La relación de tabla uno a uno tiene el siguiente aspecto:
En un sistema de base de datos relacional, una relación de tabla uno a uno vincula dos tablas en función de una Primary Key
columna en la columna secundaria que también hace Foreign Key
referencia a Primary Key
la fila de la tabla principal.
Por lo tanto, podemos decir que la tabla secundaria comparte Primary Key
con la tabla principal.
En el diagrama de tabla anterior, la id
columna de la post_details
tabla también tiene una Foreign Key
relación con la columna post
de la tabla :id
Primary Key
ALTER TABLE
post_details
ADD CONSTRAINT
fk_post_details_id
FOREIGN KEY (id) REFERENCES post
Muchos a muchos
La relación de la tabla de muchos a muchos tiene el siguiente aspecto:
En un sistema de base de datos relacional, una relación de tablas de muchos a muchos vincula dos tablas principales a través de una tabla secundaria que contiene dos Foreign Key
columnas que hacen referencia a las Primary Key
columnas de las dos tablas principales.
En el diagrama de tabla anterior, la post_id
columna de la post_tag
tabla también tiene una Foreign Key
relación con la columna post
de identificación de la tabla :Primary Key
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_post_id
FOREIGN KEY (post_id) REFERENCES post
Y la tag_id
columna de la post_tag
tabla tiene una Foreign Key
relación con la columna tag
de identificación de la tabla :Primary Key
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_tag_id
FOREIGN KEY (tag_id) REFERENCES tag