【发布时间】:2012-04-10 03:32:30
【问题描述】:
这在 Web 应用程序中是很常见的事情。如果我有一个用户表并且我想跟踪对用户表所做的所有更改,我可以使用数据库插入和更新触发器将这些更改保存在 user_history 表中。
但是如果我有 user_products 表,我有 user_id 、 product_id 和 cost。当我在系统中添加用户时,假设我有两个产品与该用户关联。因此,我的 user_products 表将为该用户提供两行。
user_id product_id cost
1 10 1000
2 20 2000
现在如果我进入编辑用户页面并删除产品 1 ,添加产品 3 ,将产品 2 的成本从 2000 更改为 3000。
所以通常我会从 user_product 表中删除 user_id 1 的所有记录,然后为新产品进行新的插入。
所以它不是定期更新,而是删除然后插入。因此,我无法跟踪历史更改。
理想情况下,我想知道我删除了产品 1,添加了产品 3,将产品 2 的成本从 2000 更改为 3000。
编辑 1:-
我没有更新。我正在删除然后插入。所以我正在删除产品 ID 为 2 且成本为 2000 的记录。然后再次插入产品 ID 为 2 但成本为 3000 的记录。所以从技术上讲,它的删除和插入但逻辑上只有成本从 2000 更改为 3000。如果我在执行两者时检查查询它会说我删除了 id 为 2 的产品,然后添加了相同的 id 为 2 的产品。但我希望能够看到成本从 2000 变为 3000
【问题讨论】:
-
为什么不直接更新而不是删除和插入?
-
@Dan A. 它基本上是从用户到产品的一对多关系。用户可以拥有 100 多种产品。如果用户现在有 10 个产品。他以后可能有40种产品。如果我向用户添加新产品,我将不得不检查该用户产品映射是否存在于表中。如果是,则更新,如果不是,则插入。所以对我来说很容易删除所有内容然后再次插入所有产品。这样我就不必检查现有记录和新记录并相应地运行插入或更新查询。
-
当您尝试跟踪历史记录时,您从不检查是否存在要更新的产品中获得的任何便利都会丢失。在我看来,通过实际执行“技术更新”来执行“逻辑更新”是更好的做法。如果您决定在产品记录中添加“create_date”和“last_updated”列怎么办?如果您更新现有记录,这很简单。