ฉันมีปัญหาเกี่ยวกับการออกแบบฐานข้อมูลซึ่งฉันได้ค้นคว้ามาระยะหนึ่งแล้ว แต่ยังไม่ได้รับคำตอบที่เหมาะสม สมมติว่าเรามีสองตาราง house_schema
และ house
ดังนี้:
house_schema {
id big int,
house_height int,
house_width int,
house_decoration vchar(1024),
build_date timestamp,
primary key id,
}
house {
id big int,
owner vchar(255),
price big int,
house_schema_id big int,
primary key id,
foreign key fk_house_house_schema_id (`house_schema_id`) reference `house_schema`.`id`
}
ตาราง house_schema
เก็บคุณลักษณะทางกายภาพบางส่วนของ house
บน UI ของซอฟต์แวร์ ผู้ใช้เลือกสคีมา จากนั้นคลิกปุ่ม "สร้าง" บ้านถูกสร้างขึ้นและเก็บไว้ใน house
มีตารางอื่นๆ เช่น house_schema
เพื่ออธิบายวิธีการสร้างบ้าน
ในการออกแบบที่เรียบง่าย ดูเหมือนว่าคีย์นอกจะทำงานได้ดี อย่างไรก็ตาม มันก่อให้เกิดปัญหาเมื่อผู้สร้างตัดสินใจลบสคีมาที่พวกเขาคิดว่าล้าสมัยออก มีบ้านบางหลังที่สร้างขึ้นจากสคีมาและคีย์ต่างประเทศป้องกันไม่ให้ลบ หากเราเปลี่ยนคีย์ต่างประเทศเป็น DELETE ON CASCADE
บ้านเหล่านั้นจะสูญเสียข้อมูลที่สร้างขึ้น
รูปแบบการออกแบบที่ดีที่สุดในการจัดการปัญหานี้คืออะไร? สิ่งที่ฉันจินตนาการได้คือการมีตารางที่ซ้ำกันเป็น house_schema
เมื่อสร้างบ้านแล้ว ให้คัดลอกแถวใน house_schema
ไปยังตารางที่ซ้ำกัน
แต่สิ่งนี้นำไปสู่ตารางที่ซ้ำกันจำนวนมากในฐานข้อมูลเนื่องจากฉันมีตารางที่คล้ายกันหลายตารางที่มี house_schema
ดูเหมือนว่าจะละเมิดกฎการทำให้ฐานข้อมูลเป็นมาตรฐาน
ไม่มีใครมีความคิดที่ดี?