0

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

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

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

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

4

2 回答 2

1

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

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

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

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

或者也可以设置为 CASCADE,这样当你删除主表中的数据时,它会自动从子表中删除。

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

于 2012-07-13T07:12:54.230 回答
0

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

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

其他方面:

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

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

于 2012-07-13T10:41:39.393 回答