2012-07-01 55 views
4

我有一个数据库设计问题,我一直在研究一段时间,但无法得到正确的答案。比方说,我们有两个表,house_schemahouse如下:在一个表中删除记录,其中存储另一个表的属性

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相似的表格。它似乎违反了数据库规范化规则。

有没有人有一个好主意?

回答

3

如果您想保留使用什么模式构建房屋的历史,典型的解决方案是在您的house_schema表上实施软删除

而不是实际删除在house_schema行你就必须

  • 添加Active列于表
  • 集此列false方案时,过时
  • 调整您的应用程序不显示非活动模式的

请注意,有相当一些关于软删除的材料,都建议ag ainst和for。

从个人的经验,我们采用的可选项目(下拉列表)我们主要应用软删除没有任何值得一提的问题为止。

当一个项目变得过时时,无论它在哪里使用,都需要保留该值,但对于新文档,它不应再显示在下拉列表中。我还不得不遇到一个更好的解决方案,以便能够处理这种情况其他比软删除。

0

有一些可能性:

  • 你可以在house_schema,你会以指示架构标志不再存在有一个“删除”领域。这意味着改变许多查询。

  • 你可以有一个“不可删除”的默认模式,当其中一个被删除时,它的房屋将回退到该模式。

0

作为一个简单的解决方案,你可以添加一个标志“删除”house_schema。这样你保持历史条目。向用户显示可用的house_schema条目时,请选择不删除的过滤条件。

0

可能增加了“deprecated_schema”,您只需将要删除的house_schema行复制到弃用的保存部分即可。您需要一个字段来存储原始house_schema ID字段,以便您仍可以访问房屋表中的正确条目。

然后您可以从house_schema表中删除,并仍然保留对基于该架构的房屋的访问权限。

0

为了增加另一个观点,你是否认为存储在* house_schema *中的细节实际上是房屋的属性,应该如此存储?
这可能被视为过度归一化的情况。

+0

我将模式存储在单独的表中,因为它是构建房屋之前的某种配置。用户选择一个配置,然后建立一个房屋,现在配置变成房子的属性。但在此之前,因为有房子,所以这不是属性。 –

相关问题