อีกวิธีหนึ่งคือการสร้างตารางการเชื่อมโยงที่มีคอลัมน์สำหรับทรัพยากรที่มีศักยภาพแต่ละประเภท ในตัวอย่างของคุณเจ้าของที่มีอยู่ทั้งสองประเภทมีตารางของตัวเอง (ซึ่งหมายความว่าคุณมีสิ่งที่ต้องอ้างอิง) หากเป็นเช่นนี้เสมอคุณสามารถมีสิ่งนี้:
CREATE TABLE dbo.Group
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.User
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.Ticket
(
ID int NOT NULL,
Owner_ID int NOT NULL,
Subject varchar(50) NULL
)
CREATE TABLE dbo.Owner
(
ID int NOT NULL,
User_ID int NULL,
Group_ID int NULL,
{{AdditionalEntity_ID}} int NOT NULL
)
ด้วยโซลูชันนี้คุณจะยังคงเพิ่มคอลัมน์ใหม่ต่อไปเมื่อคุณเพิ่มเอนทิตีใหม่ลงในฐานข้อมูลและคุณจะลบและสร้างรูปแบบข้อ จำกัด คีย์ต่างประเทศที่แสดงโดย @Nathan Skerl โซลูชันนี้คล้ายกับ @Nathan Skerl มาก แต่ดูแตกต่างกัน (ขึ้นอยู่กับความชอบ)
หากคุณจะไม่มีตารางใหม่สำหรับ Owner ใหม่แต่ละประเภทอาจเป็นการดีที่จะรวม owner_type แทนคอลัมน์ Foreign Key สำหรับเจ้าของที่มีศักยภาพแต่ละราย:
CREATE TABLE dbo.Group
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.User
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.Ticket
(
ID int NOT NULL,
Owner_ID int NOT NULL,
Owner_Type string NOT NULL, -- In our example, this would be "User" or "Group"
Subject varchar(50) NULL
)
ด้วยวิธีการข้างต้นคุณสามารถเพิ่มประเภทเจ้าของได้มากเท่าที่คุณต้องการ Owner_ID จะไม่มีข้อ จำกัด ของคีย์ภายนอก แต่จะใช้อ้างอิงไปยังตารางอื่น ๆ ข้อเสียคือคุณจะต้องดูตารางเพื่อดูว่าเจ้าของประเภทนั้นมีอะไรบ้างเนื่องจากไม่ชัดเจนในทันทีตามสคีมา ฉันจะแนะนำสิ่งนี้ก็ต่อเมื่อคุณไม่ทราบประเภทของเจ้าของล่วงหน้าและพวกเขาจะไม่เชื่อมโยงกับตารางอื่น ๆ ถ้าคุณรู้จักประเภทของเจ้าของมาก่อนฉันจะใช้วิธีแก้ปัญหาเช่น @Nathan Skerl
ขออภัยถ้าฉันมี SQL ผิดพลาดฉันเพิ่งโยนมันเข้าด้วยกัน