2012-04-14 60 views
0

我有一个问题,我可能已经知道答案,但我仍然希望听取您的意见。在店铺数据库中维护历史数据

我正在创建一个简单的商店数据库。我有一个产品表和一个订单表,并且我在这两者之间创建了一个名为Order2Product的联结表来存储订单的内容。

Product 
- id (pk) 
- name 
- price 

Order 
- id (pk) 
- order_date 
- customer (fk) 

Order2Product 
- order (fk) 
- product (fk) 
- quantity 

在这个小模型中,我可以通过向Order2Product表中添加记录并设置每个记录上的数量来存储订单。

但是,该模型不保留历史数据。如果店主更改产品3的价格,而产品3的订单是一年前订购的,那么订单的价格将会发生变化,因此我无法在发货后可靠地打印发票订单已被放置。

同样的产品名称。如果店主决定将产品的'糖果盒'重新命名为'杰克丹尼尔的礼品盒',这在发票的重印上显得很奇怪。

因此,在我看来,我需要做的就是将产品表中的名称和价格复制到Order2Product表中,而不是使用产品外键链接到产品。

您认为如何?这感觉有点有趣,因为复制数据在数据库设计中是不好的做法。另一方面,我认为这是一种情况,如果我想保持已下达订单的可靠记录,就没有其他解决方案。

另一种解决方案可能是使用产品修订版并在记录的每次更改中存储新产品记录。但是这种模式适用于Ms Access,用户可以通过Access数据表直接访问数据,因此他/她可以修改产品记录。

回答

1

标准解决方案是将价格和任何其他时间敏感信息(例如税率)存储在您存储在Order2Product表中的明细记录中。这不是第三范式的腐败,因为细节记录上的价格与产品记录上的价格不同。

这就是古老的NorthWind数据库是如何工作的。这是一个过去通过Microsoft Access分发的示例数据库。

+0

我打算复制价格以及产品名称和税率。我希望发票能够反映订单发出时的情况。谢谢。 – Julius 2012-04-14 13:05:12

+0

我不会复制产品名称,但我明白你的观点。经常有法律要求能够重新打印发票。此外,产品记录可能会成为跑步者。我的应用程序就是这种情况。当然,出于同样的原因,您可能希望将客户记录中的信息复制到订单标题中。 – 2012-04-14 13:21:06

+0

我甚至没有想过客户的信息。好点子。 – Julius 2012-04-14 14:00:42

1

您没有为价格复制数据,因为一个条目是“当前价格”,另一个是“日期x价格”。这些可能是相同的,但他们不能保证如此(如你所知)。虽然没有必要复制名称。如果产品名称发生变化,它可能是完全(带有不同ID)的新产品或者想要与订单保持一致的重新贴牌产品(具有相同ID)(尽管当时采用不同的产品名称) )。所以你想以某种方式链接到产品ID。您可能希望在另一个表中保留名称更改的记录,并可能在产品记录上标记。