我们遇到了一个问题:
当我们生成帐户(或其他文档)时,我们使用客户(员工)数据。 但是,顾客可以更改他们的数据(例如,女人结婚,她的姓氏改变了,或者她搬了 住在其他国家,她的地址发生了变化。)
我们需要,在编辑女性姓氏后,帐户 在特定日期之前保留旧姓氏,并在该特定日期之后使用女性新姓氏。
e.g。我们有一个女人:艾米丽史密斯。她于2014年12月15日结婚,她的姓氏变成了布朗。 之前:12月15日,我们使用史密斯姓氏生成她的帐户,但是在12月15日之后 我们需要使用布朗姓氏生成她的帐户。所以在数据库中我们需要保存她的姓氏。
如何保存仅使用一个或几个已更改属性进行优化的条目?
P.S。我们还需要保存更改的日期,以便知道要使用的姓氏,旧的或新的。
答案 0 :(得分:1)
这被称为缓慢变化的维度。传统的方法是记录附有生效日期和结束日期的记录。所以,Emily在这个表中会有两行:
AccountId Firstname LastName EffDate EndDate
1 Emily Smith 2001-01-01 2014-12-14
1 Emily Brown 2014-12-15 NULL
通常,当前记录的NULL
值将是远在将来的某个任意日期(例如9999-12-31)。不必在逻辑中处理NULL
可以改善性能。
然后,当您想要记录特定日期时,您只需使用该日期有效的记录。如果你想要当前的记录,同样的逻辑保持 - 找到今天有效的记录。
答案 1 :(得分:0)
Gordon在这方面有一个良好的开端,但事实是当你编写使用这样的方案的连接时,复杂性就会出现。
要使用他的方案,您需要编写如下所示的查询:
SELECT s.*, n.firstname, n.lastname FROM sometable AS s INNER JOIN account_names AS n ON s.accountid = n.accountid AND CURRENT_DATE() BETWEEN n.effdate AND n.endate
您也可以向account_names添加一个列,例如account_name_id,如果您不想一直进行日期比较,实际上会将所有下级记录链接到该列。在这种情况下,sometable需要有account_name_id而不是account_id。