วิธีออกแบบฐานข้อมูลนี้เพื่อหลีกเลี่ยงการพึ่งพาแบบวนซ้ำ?


12

มีสองตาราง:

  1. ผู้ใช้งาน
  2. ที่อยู่

ผู้ใช้มีการอ้างอิงถึงที่อยู่

ที่อยู่มีคอลัมน์ CreatedBy และ ModifiedBy ซึ่งอ้างอิงถึงผู้ใช้

ฉันจะออกแบบฐานข้อมูลนี้เพื่อหลีกเลี่ยงการพึ่งพาแบบวนซ้ำได้อย่างไร


4
คุณแน่ใจหรือไม่ว่า ModifiedBy ไม่ใช่การอ้างอิงถึงผู้ใช้ฐานข้อมูลที่ทำการเปลี่ยนแปลงแทนที่จะเป็นผู้ใช้แอปพลิเคชัน (ซึ่งจะอยู่ในตารางผู้ใช้) ไม่ว่าจะด้วยวิธีใด ฉันไม่เห็นว่าทำไมมีปัญหาจริงหรือ
Philᵀᴹ

จะสร้างอันไหนก่อน ในฐานะที่เป็นสร้างโดย AND Modifiedby เป็นข้อมูลที่ต้องมี และตารางผู้ใช้ไม่ควรมีที่อยู่เป็นโมฆะ .. ปัญหาไข่ไก่ ในขณะที่ฉันแก้ปัญหานี้โดยการสร้างตารางใหม่ UserAddress ซึ่งมีการอ้างอิงสำหรับหมายเลขผู้ใช้และที่อยู่
Shashi

2
คุณสามารถใช้ข้อ จำกัด ที่เลื่อนออกไปได้เสมอหาก DBMS ของคุณรองรับ
Colin 't Hart

NB โมเดลเชิงสัมพันธ์รองรับการแทรกหรืออัปเดตสองรายการเป็นหนึ่งการดำเนินการของอะตอมมันเป็นความอัปยศจริงที่ SQL ไม่สนับสนุน (ตามข้อ จำกัด รอการตัดบัญชี - แม้ว่าฉันจะแนะนำพวกเขา
Colin 't Hart

คำตอบ:


7

แทนที่จะค้นหาเคล็ดลับและกลเม็ด (รวมถึงข้อ จำกัด ที่รอการตัดบัญชี) ฉันขอแนะนำให้คุณออกแบบวิธีออกจาก "ล็อคการอ้างอิง" นี้ - ลองทำดังนี้:


ข้อเท็จจริง

  • (UserID)มีผู้ใช้อยู่
  • ที่อยู่(AddressID)ถูกสร้างขึ้นโดยผู้ใช้(UserID)
  • ที่อยู่(AddressID)ที่ถูกสร้างขึ้นในวันที่(DateCreated)
  • ที่อยู่(AddressID)ได้รับการปรับปรุงครั้งสุดท้ายโดยผู้ใช้(UserID)ในวันที่(ModifiedOn)
  • ผู้ใช้(UserID)อยู่ที่อยู่(AddressID)ตั้งแต่วันที่(ValidFrom)

ข้อ จำกัด

  • Each ที่อยู่ถูกสร้างขึ้นโดยผู้ใช้exactly one It is possible that more than one ที่อยู่ถูกสร้างขึ้นโดยผู้ใช้the same

  • Each ที่อยู่ที่ถูกสร้างขึ้นในวันที่exactly one It is possible that more than one ที่อยู่ที่ถูกสร้างขึ้นในวันที่the same

  • For each ที่อยู่ and วันที่ , that ที่อยู่ได้รับการแก้ไขโดยat most one ผู้ใช้ในวันที่that

  • For each ผู้ใช้ and วัน , that ผู้ใช้อาศัยat most one อยู่ตั้งแต่วันที่that


ตรรกะ

ป้อนคำอธิบายรูปภาพที่นี่


เท่าที่จำเป็นต้องมีที่อยู่บังคับตรวจสอบว่าในใบสมัครชั้นและห่องบโหลดลงในการทำธุรกรรม - วิธีที่คุณจะได้รับทั้งหมดหรือไม่มีอะไร


5

คุณไม่มีทางเลือก แต่เพื่อสร้างการพึ่งพาแบบวนซ้ำใน 2 การดำเนินการดังต่อไปนี้เนื่องจากไม่มีตารางหนึ่งอยู่เมื่อคุณสร้างตารางแรก

CREATE TABLE A (A_ID INT PRIMARY KEY, B_FK INT);
CREATE TABLE B (B_ID INT PRIMARY KEY, A_FK INT REFERENCES A(A_ID));

ALTER TABLE A ADD B_FK INT;

หากคุณต้องการหลีกเลี่ยงการพึ่งพาแบบวนซ้ำ จากนั้นคุณต้องลบข้อ จำกัด ผู้อ้างอิงหนึ่งข้อหรือคุณสามารถเพิ่มการอ้างอิงแบบ DELETE และ UPDATE แบบเรียงซ้อนในทางเดียว คุณสามารถใช้ทริกเกอร์ถ้าตรรกะของคุณค่อนข้างซับซ้อน


1
การลบข้อ จำกัด จะเป็นการลบการอ้างอิงแบบวนออกจากนิยาม แต่ไม่ใช่การออกแบบ คุณสามารถเพิ่มตารางกิจกรรมเพื่อบันทึกหมายเลขผู้ใช้และ AddressID ที่สร้างหรือแก้ไขที่อยู่ครั้งล่าสุด แต่เพียงย้ายการพึ่งพาออกไปหนึ่งก้าว อีกวิธีหนึ่งหากตารางผู้ใช้มีคอลัมน์ CreatedBy และ ModifiedBy การพึ่งพาแบบวนซ้ำจะมีอยู่ในตารางเดียว สิ่งนี้คล้ายกับตารางพนักงานที่มีคอลัมน์หัวหน้างานโดยที่ผู้บังคับบัญชาเป็นพนักงานเช่นกัน ตามที่ฟิลระบุ - ไม่ใช่ปัญหา
Leigh Riffel

@LeighRiffel ฉันเห็นด้วย แต่ตารางกิจกรรมที่คุณเสนอจะลบการอ้างอิงแบบวนซ้ำทั้งหมดออกไป
ypercubeᵀᴹ

@ypercube แน่นอนมัน; ไม่แน่ใจว่าฉันผ่านสายนั้นได้อย่างไร เพื่อความชัดเจนคุณอาจไม่ควรสร้างตารางกิจกรรมแม้ว่าจะลบการอ้างอิงแบบวนซ้ำ
Leigh Riffel

อย่างไรก็ตามฉันไม่คิดว่าคำตอบนี้จะแก้ไขปัญหาได้ คำถาม (ฉันคิดว่า) เป็นเรื่องเกี่ยวกับวิธีหลีกเลี่ยงเส้นทางแบบวนรอบเลยไม่ใช่วิธีการสร้าง FKs ด้วยเส้นทางแบบวนตั้งแต่แรก
ypercubeᵀᴹ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.