双时间数据库表设计 - 基础知识
关于双时间数据库设计所涉及概念的概述。
引言
我更多的是一个开发者,而不是一个 DBA,所以这只是一个基本概述。我一直在研究双时态表,发现很难找到任何用简单术语描述该主题的信息。所以这里是一个关于它的基本例子...
双时态数据库设计是一种存储时间依赖性数据记录的方法,以表示事实的历史和数据库中记录更改的历史。双时态数据库允许在两个正交的时间维度上进行查询:有效时间和事务时间。有效时间是指事实在现实中生效的时间。事务时间表示记录在数据库中生效的时间。
目录
时态表(建模有效时间)
大多数数据库查询只关心现在的数据,例如“商品的价格是多少?”。处理诸如“去年 11 月 3 日商品的价格是多少?”或“商品价格为 2.99 英镑持续了多久?”之类的查询很棘手。通过添加两列分别表示有效开始时间和有效结束时间,就可以表示这些查询。
实现此目的的一个简单方法是分两个阶段进行。第一阶段是使用常规方法设计数据库,例如规范化。第二阶段是为必要的表创建时态附加项。
示例 1 - 时态表
这是一个传统的 Product
表
ID Name Price
1 Eggs £1.20
2 Milk £0.45
3 Bread £0.30
他可以从此表中检索到的信息是诸如“牛奶多少钱?”之类的信息
通过添加两个日期列,我们可以执行时态查询
ID Name Price From To
1 Eggs £1.20 20/01/2006 13/06/2006
1 Eggs £1.25 13/06/2006 31/12/9999
2 Milk £0.45 20/01/2006 01/01/2007
3 Bread £0.30 20/01/2006 31/12/9999
从这张表中,我们可以提取更多信息
- 我们可以看到,
鸡蛋
在 2006 年 6 月 13 日之前是1.20 英镑
,目前是1.25 英镑
。 - 我们可以看到,
牛奶
在 2007 年 1 月 1 日之前是0.45 英镑
。目前没有价格(即,牛奶
不再出售)。 - 我们可以看到任何时间点的整个价格表。
因此,从这张表中,我们不仅可以推断出产品的当前价格,还可以确定每个产品的价格历史。
双时态表(建模有效时间和事务时间)
如上所述,时态表允许将时间段存储在数据库中。这非常适合显示对象的状态更改(有效时间)。双时态设计在此基础上扩展,不仅可以建模有效时间,还可以建模事务时间。事务时间表示事务在数据库中发生的物理时间。
例如,一批货物到达仓库。这可能发生在星期三(这将是货物在仓库中的有效时间)。操作员可能会在星期四更新系统,说明货物何时到达。他们将记录添加到系统的那一刻就是事务时间。这使我们可以在以后确定该批货物何时被认为在仓库中,以及根据数据库该批货物何时已知在仓库中。
示例 2 - 双时态表
这是一个 Stock
表的示例,其中详细说明了各个仓库中的库存
ID Stock Qty WHouseId ValidFrom ValidTo TrxStart TrxEnd OperatorId
101 Milk 12 LOND01 12/11/2006 18/11/2006 13/11/2006 18/11/2006 1111
115 Eggs 15 LOND01 12/11/2006 23/11/2006 13/11/2006 24/11/2006 1111
101 Milk 5 LOND01 18/11/2006 31/12/9999 25/11/2006 31/12/9999 1201
101 Milk 7 LOND02 18/11/2006 31/12/9999 25/11/2006 31/12/9999 1201
115 Eggs 10 LOND01 23/11/2006 31/12/2006 24/11/2006 31/12/9999 1111
从这张表中,我们可以确定诸如以下信息
- 仓库
LOND01
在 11 月 12 日至 18 日之间有12
箱牛奶
库存。 在那时,7
箱被移除并(可能)运送到仓库LOND02
。 - 牛奶被认为是在 11 月 18 日被转移的,但直到 25 日才被记录下来。
- 截至 11 月 23 日,
LOND01
中有 15 箱鸡蛋
。 在这一天,5
箱被移除。 - 目前,
LOND01
中有5
箱牛奶
和10
箱鸡蛋
,LOND02
中有7
箱牛奶
。 - 我们还可以推断出事件发生时间和在系统中记录之间的时间延迟的平均值。
- 附加的
OperatorId
可以告诉我们谁记录了每笔交易。
历史
- 2007 年 2 月 13 日:初始帖子