【发布时间】:2017-08-11 18:54:17
【问题描述】:
假设我有一个名为 products 的数据库表,其中包含一个产品列表,主键为 product_id
然后我有一个名为 purchase_order_products 的数据库表,其中包含分配给采购订单的产品列表,外键为 product_id。
现在,如果我在两个表之间强制执行引用完整性,它只需要一个采购订单来引用产品,并且永远不可能从数据库中删除该特定产品(除非该采购订单产品也被删除)。
看来我有几个选择:
1) 强制执行参照完整性,并且不允许删除产品。
2) 不要强制参照完整性,如果有人查看过产品不再存在的采购订单,只需将产品名称显示为“未知”或“已删除”。
3) 最后的选择是不仅将产品名称存储在products 表中,而且将其与外键一起存储在purchase_order_products 表中。显然这是多余的数据,但它允许从products 表中删除产品,同时仍然允许用户查看过去作为采购订单一部分的现在不存在的产品的名称。
我倾向于选项 #3,但想知道处理此问题的“正确”方式是什么。
【问题讨论】:
-
删除是硬删除还是软删除?
-
还有许多其他选项,甚至还有更多组合。在您定义要求之前,这会使您的问题“过于宽泛”。
标签: mysql database database-design relational-database