ฉันไม่คิดว่าคุณมีปัญหากับความสัมพันธ์ ฉันคิดว่าปัญหาคือแทนที่ด้วยการใช้คีย์ตัวแทน (เช่นรหัส) สำหรับแต่ละตารางฐานข้อมูลที่เป็นผลลัพธ์ไม่สามารถป้องกันไม่ให้คนงานถูกแทรกแผนกของ บริษัท หนึ่ง บริษัท ในขณะที่การจำแนกประเภทเป็นอีกประเภทหนึ่งและในทางกลับกัน วิธีที่ดีในการทำความเข้าใจสิ่งนี้คือการมองเห็นสคีมาโดยใช้เครื่องมือสร้างไดอะแกรม ER ฉันจะใช้เครื่องมือOracle Data Modelerซึ่งเป็นการดาวน์โหลดฟรี
แผนผัง ER

มันยืน, คุณอาจมี 2 บริษัท - พูดและ IBM สามารถมีแผนกและ Microsoft สามารถมีแผนกได้ IBM สามารถมีการจัดประเภทและ Microsoft สามารถมีการจัดประเภท ตอนนี้เพราะคุณมีคีย์ตัวแทนและความจริงที่ว่าเป็นสรรพสินค้าและเป็นฝ่ายจะหายไปสำหรับความสัมพันธ์ของเด็กในอนาคต และนี่ก็เป็นกรณีที่มี ดังนั้นจึงเป็นเรื่องง่ายที่จะกำหนดโดยบังเอิญที่เป็นพนักงานในแผนกการจัดหมวดหมู่ของซึ่งเป็นMicrosoftIBMSoftware DevelopmentDesktop SoftwareSoftware EngineerSoftware DeveloperDepartmentClassificationSoftware DevelopmentIBMDesktop SoftwareMicrosoftClassificationHarlan MillsIBMSoftware DevelopmentSoftware DeveloperMicrosoftการจำแนกประเภท! ในทำนองเดียวกันคนงานอาจได้รับการจำแนกที่ถูกต้องและผิดแผนก! นี่คือแผนภาพแสดงตัวอย่างแรก:

หมายเลข 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และไปอีกClassificationCompany
ทำไมเป็นไปไม่ได้ มันเป็นไปไม่ได้เพราะสคีมาดำเนินการอ้างอิงระหว่างWorkerและและDepartment Classificationหากมีการพยายามแทรก a WorkerสำหรับDepartmentหนึ่งCompanyและClassificationอีกหนึ่งชุดค่าผสมที่ไม่มีอยู่ในตารางหลักที่เกี่ยวข้องจะทำให้เกิดการละเมิดการอ้างอิงความสมบูรณ์และการแทรกจะไม่ทำงาน
นี่คือไดอะแกรมที่อัพเดตของการใช้งานตัวเลือกที่สอง:

ตัวเลือกที่ต้องการ
ในสองตัวเลือกฉันชอบอย่างที่สองโดยใช้ความสัมพันธ์ที่ระบุและปุ่มเรียงซ้อน - ด้วยเหตุผลสองประการ ครั้งแรกตัวเลือกนี้ได้รับกฎที่ต้องการโดยไม่มีการตั้งโปรแกรมเพิ่มเติม การพัฒนาทริกเกอร์นั้นไม่สำคัญ มันจะต้องถูกเข้ารหัสทดสอบและดูแลรักษา การทำให้มั่นใจว่าลอจิกแบบลอจิกนั้นเหมาะสมที่สุดเพื่อไม่ให้ส่งผลกระทบต่อประสิทธิภาพการทำงานก็ไม่สำคัญ หนังสือคณิตศาสตร์ประยุกต์สำหรับผู้เชี่ยวชาญด้านฐานข้อมูลมีรายละเอียดมากมายเกี่ยวกับความซับซ้อนของโซลูชันดังกล่าว ประการที่สองกฎบอกเป็นนัยว่าแผนกและการจำแนกไม่สามารถอยู่นอกบริบทของCompanyและตอนนี้เค้าร่างสะท้อนความเป็นจริงในโลกที่แท้จริงมากขึ้น
นี่เป็นคำถามที่ดีเพราะมันแสดงให้เห็นว่าทำไมการสมมติว่าทุกตารางต้องการคีย์ตัวแทนจึงเป็นความคิดที่ไม่ดี Fabian ปาสคาลมีโพสต์บล็อกที่ยอดเยี่ยมเพียงหัวข้อนี้แสดงให้เห็นว่าไม่เพียง แต่ที่สำคัญตัวแทนอาจจะเป็นความคิดที่ดีจากมุมมองความสมบูรณ์ของข้อมูลก็ยังสามารถส่งผลในการทำให้การสืบค้นบางช้าลงในระดับกายภาพอย่างแม่นยำเพราะการเข้าร่วมจำเป็นต้องมีการกดปุ่มอย่างถูกต้องจะไม่จำเป็น อีกหัวข้อที่น่าสนใจคำถามนี้แสดงให้เห็นว่าฐานข้อมูลไม่สามารถรับประกันได้ว่าข้อมูลทั้งหมดที่ใส่เข้าไปนั้นถูกต้องตามความเป็นจริง แต่สามารถมั่นใจได้ว่าข้อมูลที่ใส่เข้าไปนั้นสอดคล้องกับกฎที่ประกาศไว้เท่านั้น ในกรณีนี้เราสามารถทำสิ่งที่ดีที่สุดที่เป็นไปได้โดยใช้วิธีการที่สำคัญซ้อนเพื่อให้แน่ใจว่า DBMS สามารถเก็บข้อมูลที่สอดคล้องกันด้วยความเคารพในกฎที่ว่าWorkerของที่ได้รับCompanyความต้องการที่จะได้รับมอบหมายClassificationและการเดียวกันกับที่Department Companyแต่ถ้าในโลกแห่งความเป็นจริงMicrosoftมีแผนกที่เรียกว่าDesktop Softwareแต่ผู้ใช้ฐานข้อมูลยืนยันว่าเป็นแผนกแทนSoftware Development DBMS ไม่สามารถทำอะไรได้เลย แต่คิดว่ามันเป็นเรื่องจริง