通过不断编辑维护订单数据的完整性

时间:2013-10-10 20:57:15

标签: mysql database database-design mariadb

假设,如果我使用的系统可以跟踪多个表(订单,订单项,产品)中的产品和订单信息

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

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

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

1 个答案:

答案 0 :(得分:0)

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

一些可能的解决方案:

  1. 保留每个订单的产品属性的副本。这在存储方面很昂贵,但它可以更轻松地跟踪订单中存储的产品数据。
  2. 创建可以及时更改的属性日志。产品属性可能会随时间发生变化,因此存储修改日期的日志可以帮助您过滤产品属性到订单时刻是的。
  3. 选项1的提案

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

    选项2的提案

    products表分成两部分:product_general_infoproduct_attributes。产品常规信息在时间上是稳定的(产品的一般信息不会改变),因为对此表中数据的任何修改都将传播到整个订单集。产品属性必须具有datetimestamp值才能定义属性更改的时间。然后,您可以查询数据库并返回订单日期之前或之后的最后一条记录。