Чи може хтось пояснити, як реалізувати відносини один на один, один на багато і багато на багато під час проектування таблиць з деякими прикладами?
Чи може хтось пояснити, як реалізувати відносини один на один, один на багато і багато на багато під час проектування таблиць з деякими прикладами?
Відповіді:
Один на один: використовуйте зовнішній ключ до посилається таблиці:
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
Ви також повинні поставити унікальне обмеження на стовпчик із зовнішнім ключем ( addess.student_id
), щоб запобігти тому, щоб декілька рядків у дочірній таблиці ( address
) не стосувалися одного й того ж рядка у посилальній таблиці ( student
).
Один на багато : Використовуйте зовнішній ключ на багатьох сторонах відносин, посилаючись назад на "одну" сторону:
teachers: teacher_id, first_name, last_name # the "one" side
classes: class_id, class_name, teacher_id # the "many" side
Багато-багато-багато : використовуйте таблицю переходу ( приклад ):
student: student_id, first_name, last_name
classes: class_id, name, teacher_id
student_classes: class_id, student_id # the junction table
Приклад запитів:
-- 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
заданої анкети address
.
student_classes
рядок повинен мати лише одне співвідношення один на один. Якщо studentA
в classA
і classB
, то в ньому повинно бути два ряди student_classes
, один для яких відносини.
Ось декілька реальних прикладів типів стосунків:
Відносини є один на один, якщо і лише тоді, коли один запис із таблиці А пов'язаний з максимум одним записом у таблиці Б.
Щоб встановити взаємозв'язок один на один, первинний ключ таблиці B (без запису сиріт) повинен бути вторинним ключем таблиці A (із записами-сиротами).
Наприклад:
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);
Відносини є множиною, якщо і лише тоді, коли один запис із таблиці А пов'язаний з одним або кількома записами в таблиці В. Однак один запис у таблиці В не може бути пов'язаний з більш ніж одним записом у таблиці А.
Для встановлення відносини "один на багато" первинний ключ таблиці А (таблиця "один") повинен бути вторинним ключем таблиці В (таблиця "багато").
Наприклад:
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
);
Відносини є багато-багато-багато тоді і тільки тоді, коли один запис з таблиці А пов'язаний з одним або декількома записами в таблиці В і навпаки.
Щоб встановити взаємозв'язок між багатьма, створіть третю таблицю під назвою "ClassStudentRelation", в якій будуть міститися первинні ключі як таблиці A, так і таблиці 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)
);
Це дуже поширене питання, тому я вирішив перетворити цю відповідь у статтю .
Співвідношення таблиці «один до багатьох» виглядає так:
У системі реляційних баз даних взаємозв'язок таблиці "один на багато" пов'язує дві таблиці на основі Foreign Key
стовпця в дочірньому, який посилається Primary Key
на батьківський рядок таблиці.
На діаграмі таблиці вище, post_id
стовпець у post_comment
таблиці має Foreign Key
відношення до стовпця post
ідентифікатора Primary Key
таблиці:
ALTER TABLE
post_comment
ADD CONSTRAINT
fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
Співвідношення таблиці «один на один» виглядає так:
У системі реляційних баз даних взаємозв'язок таблиці один на один пов'язує дві таблиці на основі Primary Key
стовпця у дочірній, що також є Foreign Key
посиланням Primary Key
на батьківський рядок таблиці.
Тому можна сказати, що дочірня таблиця ділиться Primary Key
з батьківською таблицею.
На діаграмі таблиці вище, id
стовпець у post_details
таблиці також має Foreign Key
відношення до стовпця post
таблиці id
Primary Key
:
ALTER TABLE
post_details
ADD CONSTRAINT
fk_post_details_id
FOREIGN KEY (id) REFERENCES post
Співвідношення таблиці «багато до багатьох» виглядає так:
У реляційній системі баз даних багато-багато-багато табличних зв’язків пов'язують дві батьківські таблиці через дочірню таблицю, яка містить два Foreign Key
стовпці, що посилаються на Primary Key
стовпці двох батьківських таблиць.
На діаграмі таблиці вище, post_id
стовпець у post_tag
таблиці також має Foreign Key
зв'язок зі стовпцем post
ідентифікатора Primary Key
таблиці:
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_post_id
FOREIGN KEY (post_id) REFERENCES post
І, tag_id
стовпець у post_tag
таблиці має Foreign Key
відношення до стовпця tag
ідентифікатора Primary Key
таблиці:
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_tag_id
FOREIGN KEY (tag_id) REFERENCES tag
Відношення один до одного (1-1): це відношення між первинним та зовнішнім ключем (первинний ключ, що стосується зовнішнього ключа, лише один запис). це стосунки один до одного.
Співвідношення "Один до багатьох" (1-М): це також співвідношення між зв'язками первинного та зовнішнього ключів, але тут первинний ключ, що стосується декількох записів (тобто у таблиці A є інформація про книгу, а в таблиці B є кілька видавців однієї книги).
Багато до багатьох (ММ): багато до багатьох включає два виміри, пояснені повністю, як показано нижче зразком.
-- 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
)