3

假设,如果我使用的系统可以跨多个表(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 中复制名称、描述和价格吗?

4

1 回答 1

0

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

一些可能的解决方案:

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

选项 1 的建议

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

选项 2 的建议

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

于 2013-10-10T21:11:38.953 回答