Кто-нибудь может объяснить, как реализовать отношения один-к-одному, один-ко-многим и многие-ко-многим при разработке таблиц с некоторыми примерами?
Кто-нибудь может объяснить, как реализовать отношения один-к-одному, один-ко-многим и многие-ко-многим при разработке таблиц с некоторыми примерами?
Ответы:
Один-к-одному: используйте внешний ключ для ссылочной таблицы:
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
заданного an address
.
student_classes
строка должна иметь только одно отношение «один к одному». Если studentA
есть в classA
и classB
, то должно быть две строки student_classes
, одна для которых отношения.
Вот некоторые реальные примеры типов отношений:
Отношение является взаимно-однозначным, если и только если одна запись из таблицы A связана максимум с одной записью в таблице B.
Чтобы установить отношение «один к одному», первичный ключ таблицы 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);
Отношение является одним-ко-многим, если и только если одна запись из таблицы A связана с одной или несколькими записями в таблице B. Однако одна запись в таблице B не может быть связана с несколькими записями в таблице A.
Чтобы установить отношение «один ко многим», первичный ключ таблицы A (таблица «one») должен быть вторичным ключом таблицы B (таблица «many»).
Например:
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
);
Отношение много-ко-многим тогда и только тогда, когда одна запись из таблицы A связана с одной или несколькими записями в таблице B и наоборот.
Чтобы установить отношение «многие ко многим», создайте третью таблицу с именем «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-M): это также отношение между отношениями первичного и внешнего ключей, но здесь первичный ключ относится к нескольким записям (т. Е. В таблице 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
)