在事务表中复制数据是一个糟糕的设计吗?

时间:2010-09-23 02:07:51

标签: database-design

我有2个表产品

Product
--------
ProductID
ProductName

和SalesTransaction。

SalesTransaction
--------
TransactionID
ProductID
ProductName

用户要求声明“产品名称可能随时间而变化,但此修改不得对已存在的事务产生任何影响”。我想知道,我的设计是否适合这种要求?如果没有,如何改进我的设计?

3 个答案:

答案 0 :(得分:2)

如果要求意味着旧交易必须在交易时保留产品名称的记录,那么,是的,这是实现这一目标的一种方式。

另一种方法是使用新的productId对产品的名称更改进行建模。您需要在Product表中添加一个额外字段来标记历史记录。当产品名称更改时,只需使用新产品ID和新名称复制产品记录,并将旧记录标记为历史记录。

答案 1 :(得分:1)

这是传统方法。这不是非规范化,而是从某个时间点保存所需信息。不要因为订购商品的价格而做同样的事情。有些人不认为这样做(你必须为这些类型的记录做,无论要求是否明确说明),并且当他们开始从订单开始运行财务报告时为自己创造一个伤害的世界,因为订单附加了价格不再是客户实际收取的价格。

答案 2 :(得分:0)

您还可以将Product拆分为两个表,例如Product和ProductDetail,其中ProductDetail存储可以更改的名称和价格等内容。 ProductDetail还有From和To date列,用于指示它何时处于活动状态。将记录放入ProductDetail后,唯一可以更改的列是To date,其他所有内容都是不可变的。当产品名称更改时,您插入一个新的ProductDetail并在旧的ProductDetail上设置To date。

在SalesTransaction表中,您可以加入ProductDetail而不是Product,您将始终获得正确的产品名称。