¿Alguien puede explicar cómo implementar relaciones uno a uno, uno a muchos y muchos a muchos mientras diseña tablas con algunos ejemplos?
¿Alguien puede explicar cómo implementar relaciones uno a uno, uno a muchos y muchos a muchos mientras diseña tablas con algunos ejemplos?
Respuestas:
Uno a uno: use una clave foránea para la tabla referenciada:
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 referenciada ( student
).
Uno a muchos : use una clave externa en el lado múltiple de la relación que se vincula al 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 : use 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
student
dado address
.
student_classes
fila solo debe tener una relación uno a uno. Si studentA
está adentro classA
y classB
, entonces debería haber dos filas adentro student_classes
, una para cuál relación.
Aquí hay algunos ejemplos del mundo real de los tipos de relaciones:
Una relación es uno a uno si y solo 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 primaria de la tabla B (sin registro huérfano) 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);
Una relación es uno a muchos si y solo si un registro de la tabla A está relacionado con uno o más registros en la tabla B. Sin embargo, un registro en la tabla B no puede estar relacionado con más de un registro en la tabla A.
Para establecer una relación uno a muchos, la clave primaria 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
);
Una relación es de muchos a muchos si y solo 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 de la tabla A y 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)
);
Esta es una pregunta muy común, así que decidí convertir esta respuesta en un artículo .
La relación de la tabla uno a muchos se ve de la siguiente manera:
En un sistema de base de datos relacional, una relación de tabla de uno a muchos vincula dos tablas basadas en una Foreign Key
columna en el elemento secundario que hace referencia a la Primary Key
fila de la tabla principal.
En el diagrama de la tabla anterior, la post_id
columna de la post_comment
tabla tiene una Foreign Key
relación con la columna de post
id de la tabla Primary Key
:
ALTER TABLE
post_comment
ADD CONSTRAINT
fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
La relación de la tabla uno a uno se ve de la siguiente manera:
En un sistema de base de datos relacional, una relación de tabla uno a uno vincula dos tablas basadas en una Primary Key
columna en el elemento secundario que también hace Foreign Key
referencia a la Primary Key
fila de la tabla principal.
Por lo tanto, podemos decir que la tabla secundaria comparte Primary Key
con la tabla primaria.
En el diagrama de la tabla anterior, la id
columna de la post_details
tabla también tiene una Foreign Key
relación con la columna de la post
tabla id
Primary Key
:
ALTER TABLE
post_details
ADD CONSTRAINT
fk_post_details_id
FOREIGN KEY (id) REFERENCES post
La relación de tabla de muchos a muchos se ve de la siguiente manera:
En un sistema de base de datos relacional, una relación de tabla 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 la tabla anterior, la post_id
columna de la post_tag
tabla también tiene una Foreign Key
relación con la columna de post
ID 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 en la post_tag
tabla tiene una Foreign Key
relación con la columna tag
id de la tabla Primary Key
:
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_tag_id
FOREIGN KEY (tag_id) REFERENCES tag
Relación uno a uno (1-1): Esta es la relación entre la clave primaria y la clave externa (la clave primaria relacionada con la clave externa es solo un registro). Esta es una relación uno a uno.
Relación de uno a muchos (1-M): Esta también es la relación entre las relaciones de claves primarias y externas, pero aquí la clave principal se relaciona con registros múltiples (es decir, la Tabla A tiene información del libro y la Tabla B tiene varios publicadores de un libro).
Many to Many (MM): Many to many incluye dos dimensiones, explicadas completamente a continuación con la muestra.
-- This table will hold our phone calls.
CREATE TABLE dbo.PhoneCalls
(
ID INT IDENTITY(1, 1) NOT NULL,
CallTime DATETIME NOT NULL DEFAULT GETDATE(),
CallerPhoneNumber CHAR(10) NOT NULL
)
-- This table will hold our "tickets" (or cases).
CREATE TABLE dbo.Tickets
(
ID INT IDENTITY(1, 1) NOT NULL,
CreatedTime DATETIME NOT NULL DEFAULT GETDATE(),
Subject VARCHAR(250) NOT NULL,
Notes VARCHAR(8000) NOT NULL,
Completed BIT NOT NULL DEFAULT 0
)
-- This table will link a phone call with a ticket.
CREATE TABLE dbo.PhoneCalls_Tickets
(
PhoneCallID INT NOT NULL,
TicketID INT NOT NULL
)