เวอร์ชั่นสั้น
ฉันต้องเพิ่มคุณสมบัติเพิ่มเติมจำนวนคงที่ให้กับแต่ละคู่ในการเข้าร่วมหลายต่อหลายที่มีอยู่ การข้ามไปยังไดอะแกรมด้านล่างตัวเลือกที่ 1-4 เป็นวิธีที่ดีที่สุดในแง่ของข้อดีและข้อเสียเพื่อให้บรรลุเป้าหมายนี้โดยการขยาย Base Case? หรือมีทางเลือกอื่นที่ดีกว่าที่ฉันไม่ได้พิจารณาที่นี่?
รุ่นอีกต่อไป
ขณะนี้ฉันมีสองตารางในหลาย ๆ ความสัมพันธ์ผ่านตารางเข้าร่วมระดับกลาง ตอนนี้ฉันต้องเพิ่มลิงก์เพิ่มเติมไปยังคุณสมบัติที่เป็นของคู่ของวัตถุที่มีอยู่ ฉันมีคุณสมบัติเหล่านี้จำนวนคงที่สำหรับแต่ละคู่แม้ว่าหนึ่งรายการในตารางคุณสมบัติอาจนำไปใช้กับหลายคู่ (หรืออาจใช้หลายครั้งสำหรับหนึ่งคู่) ฉันกำลังพยายามหาวิธีที่ดีที่สุดในการทำเช่นนี้และกำลังมีปัญหาในการแยกแยะว่าจะคิดอย่างไรเกี่ยวกับสถานการณ์ ความหมายดูเหมือนว่าฉันสามารถอธิบายเป็นอย่างใดอย่างหนึ่งต่อไปนี้อย่างเท่าเทียมกันดี:
- คู่หนึ่งคู่เชื่อมโยงกับคุณสมบัติเพิ่มเติมจำนวนหนึ่งชุด
- หนึ่งคู่เชื่อมโยงกับคุณสมบัติเพิ่มเติมมากมาย
- วัตถุ (สอง) หลายตัวเชื่อมโยงกับคุณสมบัติหนึ่งชุด
- วัตถุจำนวนมากเชื่อมโยงกับคุณสมบัติมากมาย
ตัวอย่าง
ฉันมีประเภทของวัตถุสองชนิดคือ X และ Y แต่ละชนิดมี ID ที่ไม่ซ้ำกันและตารางการเชื่อมโยงที่objx_objy
มีคอลัมน์x_id
และy_id
ซึ่งรวมกันเป็นคีย์หลักสำหรับลิงก์ แต่ละ X สามารถเกี่ยวข้องกับ Ys ได้หลายคนและในทางกลับกัน นี่คือการตั้งค่าสำหรับความสัมพันธ์แบบหลายต่อหลายที่มีอยู่ของฉัน
เคสฐาน
ตอนนี้นอกจากนี้ฉันมีชุดของคุณสมบัติที่กำหนดไว้ในตารางอื่นและชุดของเงื่อนไขที่คู่ (X, Y) ที่กำหนดควรมีคุณสมบัติ P จำนวนเงื่อนไขได้รับการแก้ไขและเหมือนกันสำหรับทุกคู่ พวกเขาพูดว่า "ในสถานการณ์ C1 คู่ (X1, Y1) มีคุณสมบัติ P1", "ในสถานการณ์ C2, คู่ (X1, Y1) มีคุณสมบัติ P2" และต่อไปสำหรับสามสถานการณ์ / เงื่อนไขสำหรับแต่ละคู่ในการเข้าร่วม โต๊ะ.
ตัวเลือกที่ 1
ในสถานการณ์ปัจจุบันของฉันมีตรงสามเงื่อนไขดังกล่าวและฉันมีเหตุผลที่จะคาดหวังว่าจะเพิ่มขึ้นไม่ดังนั้นความเป็นไปได้คือการเพิ่มคอลัมน์c1_p_id
, c2_p_id
และc3_p_id
การfeatx_featy
ระบุหาได้รับx_id
และy_id
ซึ่งอสังหาริมทรัพย์p_id
เพื่อการใช้งานในแต่ละแห่งที่สามกรณี .
ดูเหมือนจะไม่เป็นความคิดที่ดีสำหรับฉันเพราะมันทำให้ SQL ซับซ้อนเพื่อเลือกคุณสมบัติทั้งหมดที่ใช้กับคุณลักษณะและไม่ได้ปรับขนาดตามเงื่อนไขเพิ่มเติม อย่างไรก็ตามจะบังคับใช้ข้อกำหนดของเงื่อนไขจำนวนหนึ่งต่อคู่ (X, Y) ในความเป็นจริงมันเป็นตัวเลือกเดียวที่นี่ที่ทำเช่นนั้น
ตัวเลือก 2
สร้างตารางเงื่อนไขcond
และเพิ่มรหัสเงื่อนไขลงในคีย์หลักของตารางเข้าร่วม
ข้อเสียอย่างหนึ่งคือไม่ได้ระบุจำนวนเงื่อนไขสำหรับแต่ละคู่ อีกอย่างคือเมื่อฉันพิจารณาความสัมพันธ์เริ่มแรกกับบางสิ่งบางอย่างเช่น
SELECT objx.*, objy.* FROM objx
INNER JOIN objx_objy ON objx_objy.x_id = objx.id
INNER JOIN objy ON objy.id = objx_objy.y_id
ฉันต้องเพิ่มส่วนDISTINCT
คำสั่งเพื่อหลีกเลี่ยงรายการที่ซ้ำกัน ดูเหมือนว่าจะสูญเสียความจริงที่ว่าแต่ละคู่ควรมีอยู่เพียงครั้งเดียว
ตัวเลือก 3
สร้าง 'รหัสประจำตัวคู่' ใหม่ในตารางเข้าร่วมแล้วมีตารางลิงก์ที่สองระหว่างตารางแรกและคุณสมบัติและเงื่อนไข
ดูเหมือนว่าจะมีข้อเสียน้อยที่สุดนอกเหนือจากการบังคับใช้เงื่อนไขจำนวนคงที่สำหรับแต่ละคู่ มันสมเหตุสมผลหรือไม่ที่จะสร้าง ID ใหม่ที่ระบุอะไรอื่นนอกจาก ID ที่มีอยู่
ตัวเลือก 4 (3b)
โดยพื้นฐานแล้วเหมือนกับตัวเลือก 3 แต่ไม่มีการสร้างฟิลด์ ID เพิ่มเติม นี้สามารถทำได้โดยการใส่รหัสเดิมทั้งในตารางใหม่เข้าร่วมเพื่อให้มันมีx_id
และเขตแทนy_id
xy_id
ข้อได้เปรียบเพิ่มเติมสำหรับแบบฟอร์มนี้คือมันไม่ได้เปลี่ยนแปลงตารางที่มีอยู่ (แม้ว่าจะยังไม่ได้ใช้งาน) อย่างไรก็ตามโดยทั่วไปมันจะทำซ้ำทั้งตารางหลายครั้ง (หรือรู้สึกอย่างนั้น) ดังนั้นจึงไม่เหมาะ
สรุป
ความรู้สึกของฉันคือตัวเลือกที่ 3 และ 4 มีความคล้ายคลึงกันมากพอที่ฉันจะเลือกได้ ฉันอาจจะมีตอนนี้ถ้าไม่ได้สำหรับความต้องการเล็ก ๆ จำนวนคงที่ของการเชื่อมโยงไปยังคุณสมบัติซึ่งทำให้ตัวเลือกที่ 1 ดูเหมือนสมเหตุสมผลกว่ามันจะเป็นอย่างอื่น จากการทดสอบที่ จำกัด มากการเพิ่มส่วนDISTINCT
คำสั่งของฉันดูเหมือนจะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงานในสถานการณ์นี้ แต่ฉันไม่แน่ใจว่าตัวเลือกที่ 2 แสดงถึงสถานการณ์เช่นเดียวกับข้ออื่น ๆ เนื่องจากการทำซ้ำโดยธรรมชาติที่เกิดจากการวาง คู่เดียวกัน (X, Y) ในหลายแถวของตารางลิงก์
เป็นหนึ่งในตัวเลือกเหล่านี้เป็นวิธีที่ดีที่สุดของฉันไปข้างหน้าหรือมีโครงสร้างอื่นที่ฉันควรพิจารณา?
DISTINCT
ประโยคที่ฉันคิดของแบบสอบถามเช่นหนึ่งในตอนท้ายของ # 2 ซึ่งเชื่อมโยงx
และy
ผ่านxyc
แต่ไม่ได้อ้างถึงc
... ดังนั้นถ้าฉันมี(x_id, y_id, c_id)
ข้อ จำกัดUNIQUE
กับแถว(1,1,1)
และ(1,1,2)
จากนั้นSELECT x.id, y.id FROM x JOIN xyc JOIN y
ฉันจะได้รับสองเหมือนกัน แถว(1,1)
, และ(1,1)
.