【问题标题】:Maintaining order data integrity with constant edits通过不断的编辑保持订单数据的完整性
【发布时间】:2013-10-11 05:11:38
【问题描述】:

假设,如果我使用的系统可以跨多个表(orders、order_items、product)跟踪产品和订单信息

orders
    id              INT(11)
    shipping_name   VARCHAR(255)
    shipping_street VARCHAR(255)
    shipping_city   VARCHAR(255)
    [etc] 

order_details
    id              INT(11)
    order_id        INT(11)
    product_id      INT(11)

products
    id              INT(11)
    name            VARCHAR(255)
    description     VARCHAR(255)
    price           DECIMAL(8,2)

结构很简单order有多个order_itemsorder_items有一个product

问题在于,当有人编辑产品时,这些编辑会修改之前订单的数据。如果员工稍后返回并查看该信息,他们可能与客户在下订单时收到的信息不同。

最佳做法是什么? 我应该在产品表中添加一个“display_item”字段,并在编辑/删除时将显示设置为 0 并将编辑后的产品添加为新行吗? 我应该在 order_details 中复制名称、描述和价格吗?

【问题讨论】:

标签: mysql database database-design mariadb


【解决方案1】:

我认为这是数据库规范化“中断”的情况之一。

一些可能的解决方案:

  1. 为每个订单保留一份产品属性的副本。这在存储方面很昂贵,但它可以更轻松地追踪存储在订单中的产品数据。
  2. 创建可及时更改的属性日志。 产品属性会随时间而变化,因此存储修改日期的日志可以帮助您过滤掉到下订单时的产品属性。

选项 1 的建议

创建products 表的副本,并为每个订单订单详细信息创建与order_details 表的关系(一对一)。

选项 2 的建议

products 表一分为二:product_general_infoproduct_attributes。产品一般信息意味着随着时间的推移是稳定的(产品的一般信息不会改变),因为对该表中数据的任何修改都会传播到整个订单集。产品属性必须具有datetimestamp 值来定义属性何时更改。然后您可以查询数据库并返回订单日期之前或之后的最后一条记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    相关资源
    最近更新 更多