我有两张桌子X和Y。这是一个基于web的CRUD应用程序的后端。
假设Y中的行有a、b和c字段。在X中创建行时,它必须链接到特定行Y中值的快照。Y中的行稍后可能会更改,但是X中的行在创建时仍然应该具有a、b和c的值。
做这种事情的“正确”方法是什么?在a、b和c中复制X字段似乎很简单,但我想知道是否有更好的方法来做到这一点。
发布于 2010-07-15 06:36:00
您需要实现一个“缓慢变化的维度”。
简单地说,除了“自然”键之外,您还拥有一个valid_from和valid_to时间戳。
当前行的"valid_to“总是为"9999-12-31 23:59:59”,或者是系统所能处理的最高日期/时间。
第一排应该是:-
id valid_to valid_from description.
1 2009-12-25 9999-12-31 My best new toy.更改描述时,不要覆盖当前行,而是添加完整的新行,更改旧行中的valid_to日期,因此:-
id valid_to valid_from description.
1 2009-12-25 2009-06-22 My best new toy
1 2010-06-23 9999-12-31 A broken toy.然后,您可以将您的Y行的创建日期使用到相应的your日期。
Select * from x
join Y on x.id = y.id
and x.create-date >= valid_from
and x.create-date <= valid_to我建议您使用时间戳而不是日期,但原则是更容易说明使用日期。
发布于 2010-07-15 06:10:11
“复制”栏目对我来说似乎是正确的选择。有些人可能错误地认为,复制数据违反了正确的数据库设计,但实际上每个表(及其列)都保存着不同的数据。一个是“当前”值,另一个表在特定时间点有这些值。
一个类似的例子是发票上的地址。如果您需要在发票时捕获客户的地址,那么您不会通过将地址列和发票放在一起来复制数据,以及在客户中有一个地址,因为它们可能包含不同版本的地址。
https://stackoverflow.com/questions/3252817
复制相似问题