Может ли кто-нибудь объяснить, как реализовать отношения "один к одному", "один ко многим" и "многие ко многим" при разработке таблиц с некоторыми примерами?
Как реализовать отношения "один к одному", "один ко многим" и "многие ко многим" при разработке таблиц?
Ответ 1
Один-к-одному: используйте внешний ключ для ссылочной таблицы:
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
) не addess.student_id
с одной и той же строкой в ссылочной таблице (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
Ответ 2
Вот некоторые реальные примеры типов отношений:
Один на один (1:1)
Отношение является взаимно-однозначным, если и только если одна запись из таблицы 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);
Один ко многим (1: М)
Отношение является одним-ко-многим, если и только если одна запись из таблицы 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)
);
Ответ 3
Отношения один к одному (1-1): Это отношения между основным и внешним ключами (первичный ключ, относящийся к внешнему ключу, только одна запись). это отношения один к одному.
Отношения "один-много" (1-М): Это также взаимосвязь между отношениями первичных и внешних ключей, но здесь первичный ключ, относящийся к нескольким записям (т.е. В таблице А есть информация о книге, а в таблице B - несколько издателей одной книги).
Многие для многих (M-M):. Многие из них включают в себя два измерения, полностью объясненные ниже с образцом.
-- 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
)