我有一个数据库设计问题,我一直在研究一段时间,但无法得到正确的答案。比方说,我们有两个表,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
一些物理属性。在软件用户界面上,用户选择一个模式,然后单击“生成”按钮。房屋建成并储存在house
。还有其他一些表格,如house_schema
来描述如何建造房屋。
在一个简单的设计中,一个外键看起来效果很好。但是,当构建者决定删除他们认为已过时的架构时,会产生问题。已经有一些从模式构建的房屋,并且外键防止它被删除。如果我们将外键更改为DELETE ON CASCADE
,那么这些房屋会丢失它所建的信息。
什么是最好的设计模式来处理这个问题?我可以想象的是,有一个house_schema
的重复表,一旦建成房屋,将house_schema
中的行复制到重复表中。
但是,这导致在数据库中有很多重复的表格,因为我有多个与house_schema
相似的表格。它似乎违反了数据库规范化规则。
有没有人有一个好主意?
我将模式存储在单独的表中,因为它是构建房屋之前的某种配置。用户选择一个配置,然后建立一个房屋,现在配置变成房子的属性。但在此之前,因为有房子,所以这不是属性。 –