Database design 数据库表中的状态列

Database design 数据库表中的状态列,database-design,Database Design,我有一个表,它保存每个记录的多个版本,例如Id=1有两个记录,我计划添加STATE列,它将指示所有版本中的最新记录。因此,最新记录的状态为1,所有旧记录的状态为0 Id NAME STATE 1 Test1 0 1 Test1_1 1 2 TEST2 1 我在其他地方也看到过这种设计。如果是公认的设计,它叫什么?以这种方式实现可以吗?我不知道它的通用名称,但您不需要名称就可以实现它。如果感觉很好,就编写代码 我偶尔也这样做过。通常我有一些版本号或更新日期。理论上,您可以编写查

我有一个表,它保存每个记录的多个版本,例如Id=1有两个记录,我计划添加STATE列,它将指示所有版本中的最新记录。因此,最新记录的状态为1,所有旧记录的状态为0

Id NAME   STATE
1  Test1   0
1  Test1_1 1
2  TEST2   1

我在其他地方也看到过这种设计。如果是公认的设计,它叫什么?以这种方式实现可以吗?

我不知道它的通用名称,但您不需要名称就可以实现它。如果感觉很好,就编写代码

我偶尔也这样做过。通常我有一些版本号或更新日期。理论上,您可以编写查询来查找最新版本的记录,选择maxversion\u stamp或类似的选项。在实践中,这是一个难题,通常需要重新查询内部查询以找到正确的记录,然后再查询外部查询以重新读取该记录。因此,这是我容忍冗余数据并添加当前标志的少数情况之一

您可能希望将主键设为id+current,这样您就可以在不必扫描的情况下找到当前记录

我曾经使用过一种替代方法,我想我喜欢,但我仍在争论:有一个表包含完整数据和唯一id。有另一个表包含引用id,然后是完整数据的FK。例如:

customer_data (customer_data_id*, date_stamp, name, address, credit_card_number, whatever)
customer (customer_number*, customer_data_id)
然后,当更新客户数据时,我们用一个新的和不相关的客户数据id创建一个新记录,给它一个日期戳,并更新客户以指向这个新记录

任何时候,我们需要客户_数据,我们都会通过加入客户来阅读

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

您希望跟踪对表中实体所做的部分或全部更改,希望能够使用相同的查询查询当前和过去的数据状态,并且希望其他表的外键引用能够像往常一样工作


这一切都是可能的,但细节太长,无法放在这里。这是一个详细介绍建模和代码的幻灯片。这可能是一个很好的部分,也可能是您所需要的全部。

Google版本控制sql表&更通用的时态数据sql。这是一个糟糕的设计。你的主键是什么?我建议一些东西,比如当前id PK,版本FK和历史id PK/FK,版本PK,名称。这篇文章解释了我要找的东西,它被称为缓慢变化的维度