【问题标题】:Best practice for dealing with deleted table rows?处理已删除表行的最佳实践?
【发布时间】:2009-06-18 02:19:17
【问题描述】:

这是我的情况。我有以下表格:

  • 产品
  • 产品属性
  • 订购产品(引用 product_id 和 order_id),
  • 订单产品属性(引用 order_product 和 product_attribute)。

当管理员进入编辑产品属性(例如“颜色”)时,他可能会错误地删除该属性,然后再将其添加回来。如果该产品已下订单,则当他删除并重新添加该属性时,其在“产品属性”表中的 ID 会更改。这使得 Order Product Attribute 引用了一个不存在的属性 ID(尽管该属性仍然存在)。

解决此问题的最佳方法是什么?也许我只是需要对这个问题有不同的看法。

注意:如果在编辑产品时刷新所有属性并重新添加当前选择的可能相同的属性,也可能会出现此问题(同样重要)。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    不允许“误删除”...只需在产品属性表中添加一个“活动”或“非活动”标志作为列。

    您始终可以使用顺序而不是属性 id 来保存属性。如果您的设计使得属性 ID 不断变化,那么您的订单没有历史有效性。要么制作产品的新“版本”,并在进行更改时将旧版本设置为非活动状态,要么按顺序保存产品的状态,以便您拥有一些历史记录。

    【讨论】:

      【解决方案2】:

      使用 innodb 作为您的表类型,并为您的依赖表添加适当的外键关系。然后,您将无法意外删除您所依赖的行。

      当然,如果您仍然希望(在某些情况下)允许这样做,您可以将 foreign_key_ 检查设置为关闭。

      【讨论】:

      • +1 非常同意。实际上,我会一直启用所有外键检查——你永远不希望产品引用未定义的属性。如果您需要删除该产品属性,则需要先将其从所有现有产品中删除。
      【解决方案3】:

      向表中添加触发器以防止删除正在使用的属性?

      向该表添加一个已删除标志并设置该标志,而不是实际删除该行。将IsDeleted = False 添加到任何访问属性表以进行选择的查询的 where 子句中。

      【讨论】:

      • 我也考虑过,但请参阅底部的注释。在那种情况下你会怎么做?看起来像这样冲洗东西是一种相当普遍的做法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2011-04-01
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多