我有两张表X
和Y
。这是基于Web的CRUD应用程序的后端。
假设Y
中的行包含字段a
,b
和c
。创建X
中的行时,必须链接到特定行Y
中值的快照。 Y
中的行可能会稍后更改,但X
中的行在创建时仍应具有a
,b
和c
的值。
做这样的事情的“正确”方式是什么?复制a
中的字段b
,c
和X
似乎很简单,但我想知道是否有更好的方法可以做到这一点。
答案 0 :(得分:3)
您需要实施“缓慢变化的维度”。
除了“自然”键之外,您还有一个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的创建日期到该日期的相应行X flr。
Select * from x
join Y on x.id = y.id
and x.create-date >= valid_from
and x.create-date <= valid_to
我建议您使用时间戳而不是日期,但使用日期更容易说明原则。
答案 1 :(得分:2)
“复制”列对我来说似乎是正确的举动。有些人可能会错误地认为您通过复制数据而违反了正确的数据库设计,但实际上每个表(及其列)都保存着不同的数据。一个是“当前”值,另一个表在特定时间点具有这些值。
类比是发票上的地址。如果您需要在发票时捕获客户的地址,那么您不会通过将地址列与发票一起复制以及与客户建立地址来复制数据,因为他们拥有可能不同版本的地址。 / p>