ฉันไม่คิดว่าคุณมีปัญหากับความสัมพันธ์ ฉันคิดว่าปัญหาคือแทนที่ด้วยการใช้คีย์ตัวแทน (เช่นรหัส) สำหรับแต่ละตารางฐานข้อมูลที่เป็นผลลัพธ์ไม่สามารถป้องกันไม่ให้คนงานถูกแทรกแผนกของ บริษัท หนึ่ง บริษัท ในขณะที่การจำแนกประเภทเป็นอีกประเภทหนึ่งและในทางกลับกัน วิธีที่ดีในการทำความเข้าใจสิ่งนี้คือการมองเห็นสคีมาโดยใช้เครื่องมือสร้างไดอะแกรม ER ฉันจะใช้เครื่องมือOracle Data Modelerซึ่งเป็นการดาวน์โหลดฟรี
แผนผัง ER
มันยืน, คุณอาจมี 2 บริษัท - พูดและ IBM
สามารถมีแผนกและ Microsoft สามารถมีแผนกได้ IBM สามารถมีการจัดประเภทและ Microsoft สามารถมีการจัดประเภท ตอนนี้เพราะคุณมีคีย์ตัวแทนและความจริงที่ว่าเป็นสรรพสินค้าและเป็นฝ่ายจะหายไปสำหรับความสัมพันธ์ของเด็กในอนาคต และนี่ก็เป็นกรณีที่มี ดังนั้นจึงเป็นเรื่องง่ายที่จะกำหนดโดยบังเอิญที่เป็นพนักงานในแผนกการจัดหมวดหมู่ของซึ่งเป็นMicrosoft
IBM
Software Development
Desktop Software
Software Engineer
Software Developer
Department
Classification
Software Development
IBM
Desktop Software
Microsoft
Classification
Harlan Mills
IBM
Software Development
Software Developer
Microsoft
การจำแนกประเภท! ในทำนองเดียวกันคนงานอาจได้รับการจำแนกที่ถูกต้องและผิดแผนก! นี่คือแผนภาพแสดงตัวอย่างแรก:
หมายเลข 1 แทนIBM
และ 2 Microsoft
รหัสแทน ฉันได้เน้นสีแดงในสถานการณ์ที่Harlan Mills
และBill Gates
กำหนดให้กับแผนกที่ไม่ถูกต้องซึ่งถูกมองเห็นได้จาก 10 แผนกรหัสที่เกี่ยวข้องกับรหัสการจำแนก 200 และในทางกลับกัน
ตัวเลือกเพื่อแก้ไข
ดังนั้นสิ่งที่เป็นตัวเลือกในการป้องกันไม่ให้เขาเกิดขึ้น? มีสองตัวเลือกทันที สิ่งแรกคือการตระหนักว่าโดยใช้คีย์ตัวแทนสำหรับทุกตารางปัญหานี้มีอยู่และแนะนำการเขียนโปรแกรมเพิ่มเติมเพื่อตรวจสอบว่ามันไม่ได้เกิดขึ้น สิ่งนี้สามารถทำได้ในแอปพลิเคชัน แต่ถ้ามีการแทรกและการอัพเดตเกิดขึ้นนอกแอปพลิเคชันการเชื่อมโยงที่ไม่ถูกต้องก็ยังคงเกิดขึ้นได้ วิธีที่ดีกว่าคือการสร้างทริกเกอร์ที่ยิงใส่และอัพเดทพนักงานเพื่อให้แน่ใจว่าแผนกที่ได้รับมอบหมายนั้นเป็น บริษัท เดียวกันกับการจำแนกประเภทที่ได้รับมอบหมายและหากไม่ได้แทรกหรืออัพเดทล้มเหลว
ตัวเลือกที่สองคือไม่ใช้คีย์ตัวแทนสำหรับทุกตาราง ให้ใช้คีย์ตัวแทนแทนสำหรับCompany
ตารางเท่านั้นซึ่งเป็นพื้นฐานและไม่มีพ่อแม่จากนั้นสร้างความสัมพันธ์ที่ระบุไปยังตารางDepartment
และClassification
ตารางลูก Department
และClassification
ตารางในขณะนี้มี PK ของการCompany Id
บวกหมายเลขลำดับหรือชื่อจะแยกพวกเขา จากนั้นความสัมพันธ์จากDepartment
และClassification
ไปWorker
ยังเป็นidentifying
และทำให้ PK ของWorker
กลายเป็นCompany Id
บวกDepartment Number
(ฉันใช้หมายเลขลำดับในตัวอย่างนี้) Classification Number
บวก ผลลัพธ์คือมีเฉพาะone
Company Id
ในWorker
ตาราง ตอนนี้มันเป็นไปไม่ได้ที่จะกำหนดWorker
ไปDepartment
ในหนึ่งCompany
และไปอีกClassification
Company
ทำไมเป็นไปไม่ได้ มันเป็นไปไม่ได้เพราะสคีมาดำเนินการอ้างอิงระหว่างWorker
และและDepartment
Classification
หากมีการพยายามแทรก a Worker
สำหรับDepartment
หนึ่งCompany
และClassification
อีกหนึ่งชุดค่าผสมที่ไม่มีอยู่ในตารางหลักที่เกี่ยวข้องจะทำให้เกิดการละเมิดการอ้างอิงความสมบูรณ์และการแทรกจะไม่ทำงาน
นี่คือไดอะแกรมที่อัพเดตของการใช้งานตัวเลือกที่สอง:
ตัวเลือกที่ต้องการ
ในสองตัวเลือกฉันชอบอย่างที่สองโดยใช้ความสัมพันธ์ที่ระบุและปุ่มเรียงซ้อน - ด้วยเหตุผลสองประการ ครั้งแรกตัวเลือกนี้ได้รับกฎที่ต้องการโดยไม่มีการตั้งโปรแกรมเพิ่มเติม การพัฒนาทริกเกอร์นั้นไม่สำคัญ มันจะต้องถูกเข้ารหัสทดสอบและดูแลรักษา การทำให้มั่นใจว่าลอจิกแบบลอจิกนั้นเหมาะสมที่สุดเพื่อไม่ให้ส่งผลกระทบต่อประสิทธิภาพการทำงานก็ไม่สำคัญ หนังสือคณิตศาสตร์ประยุกต์สำหรับผู้เชี่ยวชาญด้านฐานข้อมูลมีรายละเอียดมากมายเกี่ยวกับความซับซ้อนของโซลูชันดังกล่าว ประการที่สองกฎบอกเป็นนัยว่าแผนกและการจำแนกไม่สามารถอยู่นอกบริบทของCompany
และตอนนี้เค้าร่างสะท้อนความเป็นจริงในโลกที่แท้จริงมากขึ้น
นี่เป็นคำถามที่ดีเพราะมันแสดงให้เห็นว่าทำไมการสมมติว่าทุกตารางต้องการคีย์ตัวแทนจึงเป็นความคิดที่ไม่ดี Fabian ปาสคาลมีโพสต์บล็อกที่ยอดเยี่ยมเพียงหัวข้อนี้แสดงให้เห็นว่าไม่เพียง แต่ที่สำคัญตัวแทนอาจจะเป็นความคิดที่ดีจากมุมมองความสมบูรณ์ของข้อมูลก็ยังสามารถส่งผลในการทำให้การสืบค้นบางช้าลงในระดับกายภาพอย่างแม่นยำเพราะการเข้าร่วมจำเป็นต้องมีการกดปุ่มอย่างถูกต้องจะไม่จำเป็น อีกหัวข้อที่น่าสนใจคำถามนี้แสดงให้เห็นว่าฐานข้อมูลไม่สามารถรับประกันได้ว่าข้อมูลทั้งหมดที่ใส่เข้าไปนั้นถูกต้องตามความเป็นจริง แต่สามารถมั่นใจได้ว่าข้อมูลที่ใส่เข้าไปนั้นสอดคล้องกับกฎที่ประกาศไว้เท่านั้น ในกรณีนี้เราสามารถทำสิ่งที่ดีที่สุดที่เป็นไปได้โดยใช้วิธีการที่สำคัญซ้อนเพื่อให้แน่ใจว่า DBMS สามารถเก็บข้อมูลที่สอดคล้องกันด้วยความเคารพในกฎที่ว่าWorker
ของที่ได้รับCompany
ความต้องการที่จะได้รับมอบหมายClassification
และการเดียวกันกับที่Department
Company
แต่ถ้าในโลกแห่งความเป็นจริงMicrosoft
มีแผนกที่เรียกว่าDesktop Software
แต่ผู้ใช้ฐานข้อมูลยืนยันว่าเป็นแผนกแทนSoftware Development
DBMS ไม่สามารถทำอะไรได้เลย แต่คิดว่ามันเป็นเรื่องจริง