![]() |
1
2
如果要求意味着旧的交易必须在交易时记录产品的名称,那么,是的,这是实现这一点的一种方法。 另一种方法是使用新的productID对产品的名称更改进行建模。您需要在产品表中添加一个字段来标记历史记录。当产品名称更改时,只需使用新产品ID和新名称复制产品记录,并将旧记录标记为历史记录。 |
![]() |
2
1
这是传统的方法。这不是非规范化,而是从某个时间点保存所需信息。不要放弃对订单中商品的价格做同样的事情。有些人不认为这样做(无论要求是否明确说明),并且当他们开始从订单中运行财务报告时,为自己创造一个伤害的世界,因为附加在订单上的价格不再是客户的价格。托默被起诉了。 |
![]() |
3
0
您还可以将产品拆分为两个表,如product和productdetail,其中productdetail存储名称和价格等可以更改的内容。ProductDetail还具有“开始日期”和“结束日期”列,用于指示其处于活动状态的时间。将记录放入productdetail后,唯一可以更改的列是“结束日期”,其他所有内容都是不可变的。当产品名称更改时,插入新的ProductDetail并在旧的ProductDetail上设置结束日期。 在SalesTransaction表中,您可以连接到ProductDetail而不是Product,并且您将始终获得正确的产品名称。 |
![]() |
developer · 带外键的SQL表设计 7 月前 |
![]() |
relatively_random · 确保两个表之间一致的共同参考 8 月前 |
![]() |
b126 · 在两种不同的Oracle模式上执行相同查询的速度差异很大 1 年前 |
![]() |
robertspierre · 在多对多关系中自动删除未引用的行 1 年前 |
![]() |
Michael Samuel · MYSQL在以下情况下自动创建索引 7 年前 |