ฉันสะดุดกับปัญหาการออกแบบฐานข้อมูลที่ไม่ได้อยู่ในลีกของฉันและกูรู DBA ของฉันที่ไปใช้ยังอยู่ในช่วงซ้อมหนีไฟ
ในสาระสำคัญฉันมีตารางที่มีคีย์หลักต่อไปนี้ (PK สำหรับความกะทัดรัด):
child_id integer
parent_id integer
date datetime
child_id
และparent_id
เป็นกุญแจต่างประเทศในตารางกิจการ ตาราง "child" นั้นมี foreign key ไปยังตาราง "parent" และแท้จริงแล้วแต่ละตัวchild_id
จะอ้างอิงเหมือนกันparent_id
ตามที่คาดไว้โดยตารางข้างต้น ในความเป็นจริงปรากฎว่ามีโค้ดพิเศษบางอย่างที่ทำให้ทั้งสองซิงค์กันอยู่
ซึ่งทำให้สามเณรการปรับสภาพ overenthusiastic นี้พูดว่า "ฉันควรลบความซ้ำซ้อนแทน!"
ฉันย่อยสลายต่อไปนี้:
Table_1 PK:
child_id integer
date datetime
Table_2 PK:
parent_id integer
date datetime
Table_3: (already exists)
child_id integer PRIMARY KEY
parent_id integer FOREIGN KEY
และเมื่อฉันเข้าร่วมพวกเหล่านี้ด้วยกันอย่างเป็นธรรมชาติฉันจะกู้คืนตารางดั้งเดิม เป็นความเข้าใจของฉันที่ทำให้ 5NF นี้
อย่างไรก็ตามตอนนี้ฉันรู้ว่ามีกฎทางธุรกิจที่ซ่อนอยู่
ปกติวันที่ที่เกี่ยวข้องกับการได้รับจะต้องเป็นส่วนหนึ่งของวันที่ที่เกี่ยวข้องกับการที่สอดคล้องกันchild_id
parent_id
คุณจะเห็นว่าตารางแรกบังคับใช้กฎนี้
การย่อยสลายของฉันไม่ได้บังคับใช้กฎเนื่องจากคุณสามารถเพิ่มลงในตารางที่ 1 ได้อย่างอิสระจนกระทั่งวันที่มีขนาดใหญ่เกินไป
ซึ่งทำให้ฉันที่นี่ด้วยคำถามต่อไปนี้:
การสลายตัวนี้เป็น 5NF หรือไม่? แม้ว่าฉันจะบอกว่ามันอนุญาตให้มีการแทรกความผิดปกติ แต่ก็ดูเหมือนว่าจะทำตามตัวอย่างของ Wiki ซึ่งตัวเองทำตามคำแนะนำนี้ วลี (เหมืองของการเน้น) "เราสามารถสร้างข้อเท็จจริงที่แท้จริงทั้งหมดจากรูปแบบปกติซึ่งประกอบด้วยสามประเภทที่แตกต่างกันบันทึก" ให้ฉันหยุดพิเศษเพราะไม่ว่าฉันจะสูบขยะมากแค่ไหน
Table_1
ธรรมชาติก็ยังไม่สนใจสมมติว่าฉันไม่ชอบการสลายตัวนี้ (ฉันไม่ได้) ฉันรับทราบได้อย่างอิสระว่าวิธีแก้ปัญหาในทางปฏิบัติคือออกจากตารางและรหัสตามที่เป็นอยู่ แต่ในทางทฤษฎีแล้วมีวิธีในการย่อยสลายและ / หรือเพิ่มข้อ จำกัด เช่นที่ฉันได้รับจากตารางแรกและรักษากฎทางธุรกิจของฉันหรือไม่?