我们说我有一个名为products
的数据库表,其中有一个产品列表,主键为product_id
然后我有一个名为purchase_order_products
的数据库表,其中包含分配给采购订单的产品列表,其中包含外键product_id
。
现在,如果我在两个表之间强制实施参照完整性,则只需要一个采购订单来引用产品,并且无法从数据库中删除该特定产品(除非采购订单该产品也被删除)。
看来我有几个选择:
1)强制实施参照完整性,不允许删除产品。
2)不要强制执行参照完整性,如果有人查看产品不再存在的采购订单,只需将产品名称显示为" UNKNOWN"或" DELETED"。
3)最后一个选项是不仅将产品名称存储在products
表中,还将其存储在外键旁边的purchase_order_products
表中。显然这是冗余数据,但它允许从products
表中删除产品,同时仍然允许用户查看过去作为采购订单一部分的现有不存在产品的名称。 p>
我向选项#3摇摆不定但是想知道"是什么"处理这个问题的方法。