我有一个表保留每个记录的多个版本,例如Id = 1有两个记录,我打算添加" STATE"列将显示所有版本的最新记录。所以最新记录的STATE = 1,所有旧记录的STATE = 0。
Id NAME STATE
1 Test1 0
1 Test1_1 1
2 TEST2 1
我也看到过这个设计在其他一些地方使用过。如果它是一个公认的设计是什么叫它?以这种方式实施是否可以?
答案 0 :(得分:0)
我不知道一个普遍接受的名字,但你不需要一个名字就可以做到。如果感觉良好,请编码。
我在场合做过这件事。通常我有某种版本号或更新日期。从理论上讲,您可以编写查询来查找最新版本的记录,选择max(version_stamp)或其他类似记录。在实践中,这是一种痛苦,通常需要内部查询来查找正确的记录,然后是外部查询以重新读取该记录。因此,这是我容忍冗余数据并添加“当前”标志的少数情况之一。
您可能希望将主键设为id + current,这样您就可以找到当前记录而无需扫描。
我曾经使用过的另一种选择,我想我喜欢,但我还在辩论:有一张表格包含完整的数据和唯一的ID。拥有另一个带有“reference”id的表,然后是一个FK到完整数据。例如:
customer_data (customer_data_id*, date_stamp, name, address, credit_card_number, whatever)
customer (customer_number*, customer_data_id)
然后,当customer_data更新时,我们创建一个新记录(使用新的和无关的customer_data_id),给它一个date_stamp,并更新客户以指向这个新记录。
任何时候我们想要customer_data,我们都是通过加入客户来阅读它。
select name, address
from customer c
join customer_data d on d.customer_data_id=c.customer_data_id
where c.customer_number=@customer_number
答案 1 :(得分:0)
您希望跟踪对表中实体所做的部分或全部更改,您希望能够使用相同的查询查询当前和过去的数据(状态),并希望其他表中的外键引用能够正常工作总是这样。
这一切都是可能的,但细节太冗长了,无法放在这里。 Here是一个幻灯片放映,详细介绍了建模和代码。它可能是一个很好的部分,也可能只是你需要的一切。