删除外键引用的ID

时间:2012-07-13 06:57:53

标签: database reference foreign-keys

我有一个大型数据库,正如预期的那样,有很多外键引用表。从数据库设计的角度来看,我应该如何处理删除外键引用的记录?

我想到的一个选项是在表中添加一个布尔列,用于确定记录是否处于活动状态。因此,如果我要删除记录,我只需将其布尔活动值设置为false。

数据库可能最终变得臃肿,但不仅所有引用的外键都保持不变,数据库将保存更多信息。

我想听听您对系统关键数据库这个问题的看法。

2 个答案:

答案 0 :(得分:1)

据我了解你的问题,你有2个表:

| main  |               |     child     |
|-------|               |---------------|
|id|data| (1) ----> (n) |id|main_id (FK)|

当子表中有记录时,您不想从主表中删除数据。

您没有说,您使用的是什么RDBMS。但在MySQL中,您可以设置外键类型。如果将其设置为RESTRICT,那么如果子表中有数据,系统将不允许您从主表中删除数据。

或者您可以将其设置为CASCADE,然后当您删除主表中的数据时,它将自动从子表中删除。

因此无需创建额外的“活动”字段。

答案 1 :(得分:0)

您的问题的答案在很大程度上取决于您的申请。

如果您需要“历史”数据,那么使用“启用”标志似乎是正确的选择。但是,如果您的数据库中存在敏感数据,并且您希望确保删除的数据不太容易恢复,那么“启用” - 标志是不可行的。

其他方面:

  • 你需要“取消删除”吗?
  • 删除操作多久发生一次?许多删除会创建许多禁用的条目。
  • 是否有一种简单的方法(例如,数据库触发器)来确保引用的条目已禁用 条目也被禁用了?
  • 您是否拥有确保应用程序仅查看/处理已启用条目的流程或机制?考虑一下观点。
  • 考虑创建适当的索引以加快查找已启用的条目并需要大量空间。
  • 您是否有最终删除的要求(技术,组织,法律) 删除的条目?您是否需要为此目的删除日期?
  • 是否需要清理脚本?

我知道,很多问题。但是,我希望这些问题可以帮助您找到问题的答案。