2012-07-13 45 views
0

我有一个大型数据库,并且正如所料,引用了大量的外键。从数据库设计的角度来看,我应该如何处理删除由外键引用的记录?删除引用的外键ID

我想到的一个选择是在表中添加一个布尔列来确定记录是否激活。所以如果我要删除一条记录,我只需要将其布尔活动值设置为false。数据库可能最终会变得臃肿,但不仅如此,所有引用的外键不会保持不变,数据库将持有更多信息。

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

回答

1

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

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

而且你不想删除主表中的数据,当有子表的记录。

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

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

因此,不需要创建额外的“活动”字段。

+0

对不起,我不清楚。我使用Postgres,我知道如何删除CASCADE。我主要在整个应用程序中查看应用程序,并删除诸如用户表中的条目,这些条目在整个数据库中被很多外键引用。从经验中,建议从这些表中删除条目?难道它不会简单地增加损坏数据的可能性,而不是将活动的布尔列添加到用户表中?这是一个很好的设计吗? – greatkalu 2012-07-13 09:20:12

0

您的问题的答案高度依赖于您的应用程序。

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

其它方面:

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

我知道很多问题。不过,我希望这些问题能帮助你找到你的问题的答案。

+0

感谢您的建议。我的应用程序的全部想法是保留尽可能多的信息,而不必通过纸质工作和文件来完成,所以我将不得不选择启用标志。我的数据库有近250个表,并且它是关键的,所以我希望我的数据库服务器能够处理所有这些数据。再次感谢。 – greatkalu 2012-07-13 13:26:55