ทำไมฉันไม่ควรมีตารางหนึ่งตารางสำหรับความสัมพันธ์หลาย ๆ


12

สมมติว่าฉันมีความสัมพันธ์หลายอย่างในฐานข้อมูลของฉันเช่นร้านค้าพนักงานและการขายและฉันต้องการเชื่อมต่อคู่กับความสัมพันธ์แบบไบนารีที่เรียบง่าย ส่วนตัวฉันจะสร้างตารางชื่อ Employee_Store และ Employee_Sale ด้วยคีย์ธรรมชาติที่ประกอบด้วยคีย์ต่างประเทศ

ตอนนี้เพื่อนร่วมงานของฉันยืนยันในการสร้างหนึ่งตารางสำหรับความสัมพันธ์ที่หลากหลาย สำหรับตัวอย่างข้างต้นอาจมีตารางชื่อ EmployeeLinks:

EmployeeLinks(
    IdLink int PK, 
    IdEmployee int FK null,
    IdStore int FK null,
    IdSale int FK null,
    LinkType int not null
)

โปรดช่วยฉันด้วยเหตุผลที่ดีว่าทำไมจึงไม่ใช่ความคิดที่ดี ฉันมีข้อโต้แย้งของฉันเอง แต่ฉันต้องการให้พวกเขาเป็นส่วนตัวและรับฟังความคิดเห็นที่ไม่ลำเอียงของคุณ

แก้ไข:

เริ่มแรกตารางข้างต้นจะไม่มีคีย์หลัก (!) เนื่องจากคีย์ต่างประเทศอนุญาตให้ null คีย์ตัวแทนเป็นตัวเลือกเดียว


3
มันเหมือนOTLT หรือ EAVแต่แย่กว่านั้นเพราะมันแพร่กระจายคอลัมน์มากกว่าแถว!
oneday เมื่อ

คำตอบ:


13

เพื่อนร่วมงานของคุณเสนออะไรเป็นคีย์หลักสำหรับตารางลิงก์นี้
คอลัมน์คีย์หลักไม่สามารถเป็นค่าว่างแน่นอน: ตารางด้านบนมีค่าเป็นโมฆะ

ไม่มีตัวระบุแถวที่เป็นธรรมชาติ (ซึ่งคือสิ่งที่เป็น PK) ในตัวอย่างด้านบน (คอลัมน์ตัวตนไม่ใช่คีย์หลัก) ดังนั้นจึงล้มเหลวในกระบวนการสร้างแบบจำลองใด ๆ อย่าแม้แต่คิดเกี่ยวกับการสร้างตารางโดยไม่มีบางรุ่น (ERD, ORM, IDEF1X, อะไรก็ตาม)

คุณต้องมีข้อ จำกัด ในการตรวจสอบเพื่อให้แน่ใจว่าคุณไม่มีลิงก์ 3 ทาง

ในที่สุดคุณก็หลงทางไปสู่ดินแดนปกติในรูปแบบที่ 4 และ 5 แต่ด้วยเหตุผลที่ผิด

ฉันไม่พบตัวอย่างบนอินเทอร์เน็ต: นั่นแสดงให้เห็นว่านี่มันโง่แค่ไหน


4
+1 สำหรับI can't find any examples on the internet: that shows how stupid this is
JNK

ฉันทำให้ชัดเจนเกี่ยวกับคีย์หลัก เห็นได้ชัดว่าเพื่อนร่วมงานของฉันได้พบกับการออกแบบเช่นนี้มาก่อนหรือดังนั้นฉันจึงบอก
Tomasz Pluskiewicz

@Tomasz Pluskiewicz: รหัสตัวแทนไม่ใช่คีย์หลัก! มันถูกเลือกสำหรับเสริมคีย์ธรรมชาติในเวลาดำเนินการ ดูdba.stackexchange.com/a/13779/630นอกจากนี้เพื่อนร่วมงานของคุณควรแสดงบทความที่เชื่อถือได้ซึ่งแสดงให้เห็นถึงเทคนิคนี้ ฉันเคยเห็นกองขยะที่สมบูรณ์ในเวลาของฉัน แต่ฉันไม่ทำซ้ำพวกเขา ...
gbn

12

เหตุผลแรกที่ฉันคิดได้ก็คือประสิทธิภาพ

ในโมเดล "ดั้งเดิม" คุณสามารถมีดัชนีที่ไม่ซ้ำใครIdemployee, Idstoreหรืออะไรก็ตามที่อยู่ในทุ่งนาและรับประสิทธิภาพที่ยอดเยี่ยมในการค้นหา นอกจากนี้ยังง่ายต่อการบำรุงรักษาสำหรับเม็ดมีด ดัชนีที่ไม่ซ้ำกันช่วยให้คุณผสานเข้าด้วยกันบ่อยครั้งขึ้นซึ่งจะทำให้มีจำนวนมากJOINอย่างรวดเร็วอย่างเห็นได้ชัด

ในแบบจำลองตัวอย่างของคุณเพื่อให้ได้ประสิทธิภาพที่ดีคุณจะต้องมีดัชนีฟิลด์เดียวในทุกฟิลด์ FK ในตารางอย่างน้อยที่สุดดัชนีครอบคลุมครอบคลุมในชุดค่าผสมทั้งหมดที่จะอ้างอิง ได้แก่ :

  • ลูกจ้าง / ร้านค้า
  • ลูกจ้าง / ขาย

ฉันไม่แน่ใจว่า linktype คืออะไร แต่ถ้าคุณอ้างอิงมันควรจะทำดัชนี

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

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

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


คอลัมน์ LinkType เป็นสิ่งที่แยกแยะได้ เพียงแค่บอกว่าแถวไหนเกี่ยวข้องกันจริงๆ เพียงเพิ่มการคุมกำเนิดถ้าคุณถามฉัน
Tomasz Pluskiewicz

@TomaszPluskiewicz ฉันคิดว่าวิธีที่ดีที่สุดที่จะแสดงให้เขาเห็นว่าทำไมมันถึงแย่มากคือการสร้างชุดข้อมูลตัวอย่างที่มีทั้งสองประเภทของตารางในนั้นและเรียกใช้แบบสอบถามบางอย่าง แบบจำลองของเขาจะช้ากว่าแบบดั้งเดิมมาก
JNK

4

การใส่หลายความสัมพันธ์ลงในตารางเดียวจะมีประโยชน์หากความสัมพันธ์เหล่านั้นมีคุณลักษณะเดียวกันและ / หรือถ้าคุณต้องการรวมข้อมูลผ่านความสัมพันธ์หลาย ๆ

จำเป็นถ้าประเภทของความสัมพันธ์ถูกกำหนดโดยผู้ใช้ที่รันไทม์ อย่างไรก็ตามนี่เป็นกรณีที่ไม่ค่อยเกิดขึ้นจริง

ในตัวอย่างของคุณความสัมพันธ์ไม่แชร์แอตทริบิวต์ความสัมพันธ์นั้นถึงสองตารางที่แตกต่างกัน สิ่งนี้ทำให้ยากต่อการบังคับใช้ข้อ จำกัด และการออกแบบนั้นยังใช้งานง่าย

ฉันจะเลือกการออกแบบนั้นก็ต่อเมื่อการสร้างตารางใช้เงินอย่างแท้จริง

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