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

Database design 在事务表中复制数据是一种糟糕的设计吗?,database-design,Database Design,我有两张桌子 Product -------- ProductID ProductName 销售交易 SalesTransaction -------- TransactionID ProductID ProductName 用户需求声明“产品名称可以随时间变化,但此修改不得对已存在的交易产生任何影响”。我想知道,我的设计适合这种需求吗?如果没有,如何改进我的设计?如果要求旧交易必须在交易时保留产品名称的记录,那么,是的,这是实现这一点的一种方法 另一种方法是用一个新的productId对产

我有两张桌子

Product
--------
ProductID
ProductName
销售交易

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

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

如果要求旧交易必须在交易时保留产品名称的记录,那么,是的,这是实现这一点的一种方法


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

您还可以将产品拆分为两个表,如product和ProductDetail,ProductDetail在其中存储名称和价格等可能更改的内容。ProductDetail还有“起始日期”和“截止日期”列,用于指示其处于活动状态的时间。在ProductDetail中放置记录后,唯一可以更改的列是“截止日期”,其他所有内容都是不可变的。当产品名称更改时,请插入新的ProductDetail并在旧的ProductDetail上设置截止日期


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

这是传统的方法。这不是非规范化,而是从一个时间点保存所需的信息。大学教师;I don’我不希望对订单上的商品价格也做同样的事情。有些人认为,当他们开始从订单中运行财务报告时,他们不会这样做(无论要求是否明确规定,您必须对这些类型的记录这样做),也不会给自己造成伤害,因为订单上的价格不再是客户实际收取的价格。

我面临的问题,我无法使用此方法跟踪产品名称。我认为它可能有另一种比这个更优雅、更健壮的方法。为什么您不能跟踪产品名称,您正在将其存储在销售交易表中?请停止尝试“优雅”,“优雅”一文不值,而且通常对数据库操作有害。最有效的方法往往是应用程序程序员会认为是笨拙的。从数据库的角度来说,这是一件坏事。我知道我们在事务表中有这些信息,但想想母版页。如果交易打印出产品A是在去年3个月后售出的,则A已将其名称更改为B。现在,客户来到商店并要求购买产品A,员工尝试从母版页中查找该产品,该母版页从母版表中查询数据。我是否需要同时从主表和事务表进行查询?