ใครสามารถอธิบายวิธีการใช้ความสัมพันธ์แบบหนึ่งต่อหนึ่งแบบตัวต่อตัวและแบบกลุ่มต่อกลุ่มในขณะที่ออกแบบตารางพร้อมตัวอย่าง
ใครสามารถอธิบายวิธีการใช้ความสัมพันธ์แบบหนึ่งต่อหนึ่งแบบตัวต่อตัวและแบบกลุ่มต่อกลุ่มในขณะที่ออกแบบตารางพร้อมตัวอย่าง
คำตอบ:
หนึ่งต่อหนึ่ง:ใช้ foreign key ไปยังตารางอ้างอิง:
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
คุณต้องใส่ข้อ จำกัด ที่ไม่ซ้ำกันในคอลัมน์ foreign key ( addess.student_id
) เพื่อป้องกันหลายแถวในตารางลูก ( address
) ไม่ให้เกี่ยวข้องกับแถวเดียวกันในตารางที่อ้างอิง ( student
)
One-to-Many : ใช้ foreign key ในหลาย ๆ ด้านของความสัมพันธ์ที่เชื่อมโยงกลับไปที่ด้าน "หนึ่ง":
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
หนึ่งแถวที่มีความสัมพันธ์
นี่คือตัวอย่างจริงของประเภทความสัมพันธ์:
ความสัมพันธ์เป็นแบบหนึ่งต่อหนึ่งถ้าหากหนึ่งระเบียนจากตาราง 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 (ตาราง "หนึ่ง") จะต้องเป็นคีย์รองของตาราง B (ตาราง "หลายคน")
ตัวอย่างเช่น:
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
id ของตาราง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 มีผู้จัดพิมพ์หลายเล่มของหนังสือเล่มหนึ่ง)
หลายต่อหลายคน (MM):หลายต่อหลายคนมีสองมิติอธิบายอย่างเต็มที่ด้านล่างพร้อมตัวอย่าง
-- 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
)