SQL Server业务逻辑:删除引用的数据

时间:2010-09-22 17:21:26

标签: sql sql-server

我很好奇其他人是如何处理这件事的。

想象一下只有产品,采购订单和采购订单行的系统。采购订单是与采购订单行的父子关系中的父级。采购订单行,引用单个产品。

这很有效,直到您删除采购订单行引用的产品。突然之间,Line知道它卖了30件东西......但它不知道是什么。

预测删除这样的引用数据有什么好方法?我想如果任何采购订单行引用它,你可以直接禁止删除产品,但这听起来很......笨重。我想可能你会在数据库中保留采购订单多年,基本上将你要删除的产品焊接到数据库中。

3 个答案:

答案 0 :(得分:4)

除非您删除父实体,否则不应删除父实体或依赖行不再有意义。虽然将旧记录作为有效选择显示给用户是“笨拙”,但让数据库继续有意义并不笨拙。

为了解决用户界面中的笨拙问题,有些人会创建一个非活动列,当项目不再处于活动状态时,该列设置为True,以便可以将其保留在用户界面的下拉列表中。

如果在显示字段(例如,只读字段)中使用该值,则可以以不同的方式(例如,删除)来设置非活动值的样式,以反映其不再活动的状态。

我在所有实体表中都有StartDate和ExpiryDate列,其中实体可以变为非活动状态,或者实体将在某个时间点变为活动状态(例如促销折扣)。

答案 1 :(得分:3)

执行referential integrity。这基本上意味着在表之间创建外键并确保没有任何“消失”

您还可以使用此选项在删除父项时删除引用的项目(级联删除)。

例如,您可以创建一个SQL Server表,如果删除了PurchaseOrder,它的子PurchaseOrderLines也会被删除。

Here is a good article进入那个。

保留这些数据(至少对我来说)似乎并不笨拙。如果您将其删除,那么您的采购订单不再具有创建它时的含义,这是一件坏事。如果您担心在那里有旧数据,您总是可以创建一个包含超过一年的东西的存档或仓库数据库......

答案 2 :(得分:2)

对于这样的数据,其中部分内容必须保留一段未知的时间而其他部分则不需要,您需要采取不同的方法。

您的采购订单行(POL)表需要包含产品表所具有的所有列。将订单项添加到采购订单后,将所有产品数据复制到POL中。这包括名称,价格等。如果产品有选项,那么您必须创建相应的PurchaseOrderLineOptions表。

这是确保您可以随时根据需要重新创建采购订单的唯一真实方式。这也意味着有人可以随时更改产品的定价,名称,描述和其他信息,而不会影响之前的订单。

是的,您最终在订单项表格中输入了大量重复信息。但那没关系。

对于踢,您可以将产品ID保留在POL表中以便参考,但您不能依赖产品表来对付费产品产生任何影响......