Czy ktoś może wyjaśnić, jak wdrożyć relacje jeden do jednego, jeden do wielu i wiele do wielu podczas projektowania tabel z kilkoma przykładami?
Czy ktoś może wyjaśnić, jak wdrożyć relacje jeden do jednego, jeden do wielu i wiele do wielu podczas projektowania tabel z kilkoma przykładami?
Odpowiedzi:
Jeden do jednego: użyj klucza obcego do tabeli, do której istnieje odwołanie:
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
Należy także nałożyć unikalne ograniczenie na kolumnę klucza obcego ( addess.student_id
), aby zapobiec powiązaniu wielu wierszy w tabeli potomnej ( address
) z tym samym wierszem w tabeli, do której istnieje odwołanie ( student
).
Jeden do wielu : użyj klucza obcego po wielu stronach relacji, łącząc się z powrotem z jednej strony:
teachers: teacher_id, first_name, last_name # the "one" side
classes: class_id, class_name, teacher_id # the "many" side
Wiele do wielu : użyj tabeli połączeń ( przykład ):
student: student_id, first_name, last_name
classes: class_id, name, teacher_id
student_classes: class_id, student_id # the junction table
Przykładowe zapytania:
-- 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
danego address
.
student_classes
wiersz powinien mieć tylko jedną relację jeden do jednego. Jeśli studentA
jest w, classA
i classB
powinny być dwa wiersze, w student_classes
jednym dla których relacji.
Oto kilka przykładów rzeczywistych rodzajów relacji:
Relacja jest jeden do jednego wtedy i tylko wtedy, gdy jeden rekord z tabeli A jest powiązany z maksymalnie jednym rekordem w tabeli B.
Aby ustanowić relację jeden-do-jednego, klucz podstawowy tabeli B (bez rekordu osieroconego) musi być kluczem dodatkowym tabeli A (z rekordami osieroconymi).
Na przykład:
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);
Relacja jest jeden do wielu wtedy i tylko wtedy, gdy jeden rekord z tabeli A jest powiązany z jednym lub większą liczbą rekordów w tabeli B. Jednak jeden rekord w tabeli B nie może być powiązany z więcej niż jednym rekordem w tabeli A.
Aby ustanowić relację jeden do wielu, klucz podstawowy tabeli A (tabela „jeden”) musi być kluczem dodatkowym tabeli B (tabela „wielu”).
Na przykład:
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
);
Relacja jest wiele do wielu wtedy i tylko wtedy, gdy jeden rekord z tabeli A jest powiązany z jednym lub większą liczbą rekordów w tabeli B i odwrotnie.
Aby ustanowić relację wiele do wielu, utwórz trzecią tabelę o nazwie „ClassStudentRelation”, która będzie zawierała klucze podstawowe zarówno tabeli A, jak i tabeli 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)
);
To bardzo częste pytanie, dlatego postanowiłem zamienić tę odpowiedź w artykuł .
Relacja tabeli jeden do wielu wygląda następująco:
W systemie relacyjnych baz danych relacja jeden do wielu łączy dwie tabele na podstawie Foreign Key
kolumny w elemencie potomnym, która odwołuje się Primary Key
do wiersza tabeli nadrzędnej.
Na powyższym diagramie tabeli post_id
kolumna w post_comment
tabeli ma Foreign Key
związek z kolumną post
identyfikatora tabeli Primary Key
:
ALTER TABLE
post_comment
ADD CONSTRAINT
fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
Relacja tabeli jeden do jednego wygląda następująco:
W systemie relacyjnej bazy danych relacja jeden-do-jednego tabeli łączy dwie tabele na podstawie Primary Key
kolumny w elemencie potomnym, która jest również Foreign Key
odniesieniem do Primary Key
wiersza tabeli nadrzędnej.
Dlatego możemy powiedzieć, że tabela potomna dzieli się Primary Key
z tabelą nadrzędną.
Na powyższym schemacie tabeli id
kolumna w post_details
tabeli ma również Foreign Key
związek z kolumną post
tabeli id
Primary Key
:
ALTER TABLE
post_details
ADD CONSTRAINT
fk_post_details_id
FOREIGN KEY (id) REFERENCES post
Relacja wielu do wielu wygląda następująco:
W systemie relacyjnej bazy danych relacja wiele do wielu łączy dwie tabele nadrzędne za pośrednictwem tabeli podrzędnej, która zawiera dwie Foreign Key
kolumny odwołujące się do Primary Key
kolumn dwóch tabel nadrzędnych.
Na powyższym diagramie tabeli post_id
kolumna w post_tag
tabeli ma również Foreign Key
związek z kolumną post
identyfikatora tabeli Primary Key
:
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_post_id
FOREIGN KEY (post_id) REFERENCES post
I tag_id
kolumna w post_tag
tabeli ma Foreign Key
związek z kolumną tag
identyfikatora tabeli Primary Key
:
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_tag_id
FOREIGN KEY (tag_id) REFERENCES tag
Relacja jeden do jednego (1-1): Jest to relacja między kluczem podstawowym a kluczem obcym (klucz podstawowy związany z kluczem obcym tylko jeden rekord). jest to relacja jeden do jednego.
Relacja jeden do wielu (1-M): Jest to także relacja między kluczem podstawowym a kluczem obcym, ale tutaj klucz podstawowy dotyczy wielu rekordów (tj. Tabela A zawiera informacje o książce, a Tabela B ma wielu wydawców jednej książki).
Wiele do wielu (MM): Wiele do wielu obejmuje dwa wymiary, wyjaśnione w pełni jak poniżej z próbką.
-- 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
)