Bất cứ ai cũng có thể giải thích làm thế nào để thực hiện các mối quan hệ một-một, một-nhiều và nhiều-nhiều trong khi thiết kế các bảng với một số ví dụ?
Bất cứ ai cũng có thể giải thích làm thế nào để thực hiện các mối quan hệ một-một, một-nhiều và nhiều-nhiều trong khi thiết kế các bảng với một số ví dụ?
Câu trả lời:
Một đối một: Sử dụng khóa ngoại cho bảng được tham chiếu:
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
Bạn cũng phải đặt một ràng buộc duy nhất trên cột khóa ngoài ( addess.student_id
) để ngăn nhiều hàng trong bảng con ( address
) liên quan đến cùng một hàng trong bảng được tham chiếu ( student
).
Một-nhiều : Sử dụng khóa ngoại ở nhiều phía của mối quan hệ liên kết lại với phía "một":
teachers: teacher_id, first_name, last_name # the "one" side
classes: class_id, class_name, teacher_id # the "many" side
Nhiều-nhiều : Sử dụng bảng nối ( ví dụ ):
student: student_id, first_name, last_name
classes: class_id, name, teacher_id
student_classes: class_id, student_id # the junction table
Các truy vấn mẫu:
-- 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
cho một address
.
student_classes
hàng chỉ nên có một mối quan hệ một đối một. Nếu studentA
ở trong classA
và classB
, thì nên có hai hàng trong student_classes
, một hàng cho mối quan hệ.
Dưới đây là một số ví dụ thực tế về các loại mối quan hệ:
Mối quan hệ là một đối một khi và chỉ khi một bản ghi từ bảng A có liên quan đến tối đa một bản ghi trong bảng B.
Để thiết lập mối quan hệ một đối một, khóa chính của bảng B (không có bản ghi mồ côi) phải là khóa phụ của bảng A (có bản ghi mồ côi).
Ví dụ:
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);
Mối quan hệ là một-nhiều nếu và chỉ khi một bản ghi từ bảng A có liên quan đến một hoặc nhiều bản ghi trong bảng B. Tuy nhiên, một bản ghi trong bảng B không thể liên quan đến nhiều hơn một bản ghi trong bảng A.
Để thiết lập mối quan hệ một-nhiều, khóa chính của bảng A (bảng "một") phải là khóa phụ của bảng B (bảng "nhiều").
Ví dụ:
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
);
Một mối quan hệ là nhiều-nhiều nếu và chỉ khi một bản ghi từ bảng A có liên quan đến một hoặc nhiều bản ghi trong bảng B và ngược lại.
Để thiết lập mối quan hệ nhiều-nhiều, hãy tạo một bảng thứ ba có tên "ClassStudentRelation" sẽ có các khóa chính của cả bảng A và bảng 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)
);
Đây là một câu hỏi rất phổ biến, vì vậy tôi quyết định biến câu trả lời này thành một bài viết .
Mối quan hệ một-nhiều bảng trông như sau:
Trong một hệ thống cơ sở dữ liệu quan hệ, mối quan hệ một-nhiều bảng liên kết hai bảng dựa trên một Foreign Key
cột trong con tham chiếu đến hàng Primary Key
của bảng cha.
Trong sơ đồ bảng ở trên, post_id
cột trong post_comment
bảng có Foreign Key
mối quan hệ với cột post
id bảng Primary Key
:
ALTER TABLE
post_comment
ADD CONSTRAINT
fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
Mối quan hệ một-một-bảng trông như sau:
Trong một hệ thống cơ sở dữ liệu quan hệ, mối quan hệ một-một liên kết hai bảng dựa trên một Primary Key
cột trong con cũng là Foreign Key
tham chiếu Primary Key
của hàng của bảng cha.
Do đó, chúng ta có thể nói rằng bảng con chia sẻ Primary Key
với bảng cha.
Trong sơ đồ bảng trên, id
cột trong post_details
bảng cũng có Foreign Key
mối quan hệ với cột post
bảng id
Primary Key
:
ALTER TABLE
post_details
ADD CONSTRAINT
fk_post_details_id
FOREIGN KEY (id) REFERENCES post
Mối quan hệ nhiều-nhiều-bảng trông như sau:
Trong một hệ thống cơ sở dữ liệu quan hệ, mối quan hệ nhiều-nhiều bảng liên kết hai bảng cha thông qua một bảng con chứa hai Foreign Key
cột tham chiếu các Primary Key
cột của hai bảng cha.
Trong sơ đồ bảng ở trên, post_id
cột trong post_tag
bảng cũng có Foreign Key
mối quan hệ với cột post
id bảng Primary Key
:
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_post_id
FOREIGN KEY (post_id) REFERENCES post
Và, tag_id
cột trong post_tag
bảng có Foreign Key
mối quan hệ với cột tag
id bảng Primary Key
:
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_tag_id
FOREIGN KEY (tag_id) REFERENCES tag
Mối quan hệ 1-1 (1-1): Đây là mối quan hệ giữa khóa chính & khóa ngoài (khóa chính liên quan đến khóa ngoài chỉ có một bản ghi). đây là một mối quan hệ
Mối quan hệ Một đến Nhiều (1-M): Đây cũng là mối quan hệ giữa các mối quan hệ khóa chính & khóa ngoài nhưng ở đây khóa chính liên quan đến nhiều bản ghi (ví dụ Bảng A có thông tin sách và Bảng B có nhiều nhà xuất bản của một cuốn sách).
Nhiều đến nhiều (MM): Nhiều đến nhiều bao gồm hai chiều, được giải thích đầy đủ như dưới đây với mẫu.
-- 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
)