อีกวิธีหนึ่ง (ไม่มี Nulls และไม่มีรอบในFOREIGN KEY
ความสัมพันธ์) คือการมีตารางที่สามเพื่อจัดเก็บ "เด็กที่ชื่นชอบ" ใน DBMS ส่วนใหญ่คุณจะต้องเพิ่มUNIQUE
ข้อ จำกัด TableB
ใน
@Aaron เร็วกว่าที่จะระบุว่ารูปแบบการตั้งชื่อด้านบนค่อนข้างยุ่งยากและสามารถนำไปสู่ข้อผิดพลาดได้ โดยปกติแล้วจะดีกว่า (และจะทำให้คุณมีสติ) หากคุณไม่มีId
คอลัมน์ทั่วตารางของคุณและหากคอลัมน์ (ที่เชื่อมต่อ) มีชื่อเดียวกันในตารางจำนวนมากที่ปรากฏ ดังนั้นนี่คือการเปลี่ยนชื่อ:
Parent
ParentID INT NOT NULL PRIMARY KEY
Child
ChildID INT NOT NULL PRIMARY KEY
ParentID INT NOT NULL FOREIGN KEY REFERENCES Parent (ParentID)
UNIQUE (ParentID, ChildID)
FavoriteChild
ParentID INT NOT NULL PRIMARY KEY
ChildID INT NOT NULL
FOREIGN KEY (ParentID, ChildID)
REFERENCES Child (ParentID, ChildID)
ใน SQL-Server (ที่คุณกำลังใช้) คุณยังมีตัวเลือกของIsFavorite
คอลัมน์บิตที่คุณพูดถึง เด็กคนโปรดที่ไม่ซ้ำกันต่อผู้ปกครองสามารถทำได้ผ่านดัชนีที่ไม่ซ้ำกรอง
Parent
ParentID INT NOT NULL PRIMARY KEY
Child
ChildID INT NOT NULL PRIMARY KEY
ParentID INT NOT NULL FOREIGN KEY REFERENCES Parent (ParentID)
IsFavorite BIT NOT NULL
CREATE UNIQUE INDEX is_FavoriteChild
ON Child (ParentID)
WHERE IsFavorite = 1 ;
และเหตุผลหลักที่ไม่แนะนำให้ใช้ตัวเลือกที่ 1 ของคุณอย่างน้อยไม่ใช่ใน SQL-Server นั่นคือรูปแบบของเส้นทางวงกลมในการอ้างอิงคีย์ต่างประเทศมีปัญหาบางอย่าง
อ่านบทความที่ค่อนข้างเก่า: SQL โดยการออกแบบ: การอ้างอิงแบบวงกลม
เมื่อแทรกหรือลบแถวออกจากตารางทั้งสองคุณจะพบกับปัญหา "ไก่และไข่" ฉันควรแทรกตารางใดก่อน - โดยไม่ละเมิดข้อ จำกัด ใด ๆ
เพื่อแก้ปัญหานั้นคุณต้องกำหนดอย่างน้อยหนึ่งคอลัมน์ที่ไม่สามารถใช้ได้ (ตกลงทางเทคนิคคุณจะได้ไม่ต้องคุณสามารถมีคอลัมน์ทั้งหมดเป็นNOT NULL
แต่เฉพาะใน DBMS เช่น Postgres และ Oracle ที่ได้ดำเนินการ จำกัด deferrable ดู @ คำตอบเออร์วินในคำถามที่คล้ายกัน:. คอมเพล็กซ์ จำกัด ที่สำคัญต่างประเทศใน SQLAlchemyเกี่ยวกับวิธีการ สิ่งนี้สามารถทำได้ใน Postgres) ยังตั้งค่านี้รู้สึกเหมือนเล่นสเก็ตบนน้ำแข็งบาง ๆ
ลองดูคำถามที่เกือบจะเหมือนกันที่ SO (แต่สำหรับ MySQL) ใน SQL มันจะโอเคไหมที่จะอ้างถึงสองตาราง? คำตอบของฉันก็ค่อนข้างเหมือนกัน MySQL ไม่มีดัชนีบางส่วนดังนั้นทางเลือกเดียวที่ทำงานได้คือ FK แบบ nullable และโซลูชันตารางพิเศษ