我有一个大型数据库,并且正如所料,引用了大量的外键。从数据库设计的角度来看,我应该如何处理删除由外键引用的记录?删除引用的外键ID
我想到的一个选择是在表中添加一个布尔列来确定记录是否激活。所以如果我要删除一条记录,我只需要将其布尔活动值设置为false。数据库可能最终会变得臃肿,但不仅如此,所有引用的外键不会保持不变,数据库将持有更多信息。
我想听听您对这个关于系统关键数据库的问题的想法。
我有一个大型数据库,并且正如所料,引用了大量的外键。从数据库设计的角度来看,我应该如何处理删除由外键引用的记录?删除引用的外键ID
我想到的一个选择是在表中添加一个布尔列来确定记录是否激活。所以如果我要删除一条记录,我只需要将其布尔活动值设置为false。数据库可能最终会变得臃肿,但不仅如此,所有引用的外键不会保持不变,数据库将持有更多信息。
我想听听您对这个关于系统关键数据库的问题的想法。
据我理解你的问题,你有2个表:
| main | | child |
|-------| |---------------|
|id|data| (1) ----> (n) |id|main_id (FK)|
而且你不想删除主表中的数据,当有子表的记录。
您没有说,您使用的是什么RDBMS。但在MySQL中,您可以设置外键类型。如果将其设置为RESTRICT,那么如果子表中有数据,则系统将不允许您从主表中删除数据。
或者您可以将其设置为CASCADE,那么当您删除主表中的数据时,它将自动从子表中删除。
因此,不需要创建额外的“活动”字段。
您的问题的答案高度依赖于您的应用程序。
如果您需要“历史”数据,那么使用“启用”标志似乎是正确的选择。但是,如果您的数据库中存在敏感数据,并且您希望确保删除的数据不太容易恢复,那么“启用”标记是不可行的。
其它方面:
我知道很多问题。不过,我希望这些问题能帮助你找到你的问题的答案。
感谢您的建议。我的应用程序的全部想法是保留尽可能多的信息,而不必通过纸质工作和文件来完成,所以我将不得不选择启用标志。我的数据库有近250个表,并且它是关键的,所以我希望我的数据库服务器能够处理所有这些数据。再次感谢。 – greatkalu 2012-07-13 13:26:55
对不起,我不清楚。我使用Postgres,我知道如何删除CASCADE。我主要在整个应用程序中查看应用程序,并删除诸如用户表中的条目,这些条目在整个数据库中被很多外键引用。从经验中,建议从这些表中删除条目?难道它不会简单地增加损坏数据的可能性,而不是将活动的布尔列添加到用户表中?这是一个很好的设计吗? – greatkalu 2012-07-13 09:20:12