2013-10-10 56 views
3

假设,如果我是与该跟踪产品和跨多个表顺序信息(订单,ORDER_ITEMS,产品)保持与恒定的编辑顺序的数据完整性

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_items,order_items有一个product

问题是,当有人编辑产品时,这些编辑会修改以前订单的数据。如果员工稍后返回并查看该信息,则他们可能没有与订单发出时客户收到的信息相同的信息。

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

+0

看看[这篇文章](http://stackoverflow.com/a/11930467/533120)。 –

回答

0

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

一些可能的解决方案:

  1. 保持产品的副本属性,每个订单。这在存储方面很昂贵,但它更容易追踪订单中存储的产品数据。
  2. 创建可以及时更改的属性日志。产品属性可能随时间而改变,因此存储修改日期的日志可以帮助您在订单生成时过滤出产品属性。

提案选项1

创建products表的副本和每个订单顺序详细创建的关系(一对的一个)到order_details表。

提案选项2

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