65.9K
CodeProject 正在变化。 阅读更多。
Home

双时间数据库表设计 - 基础知识

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.20/5 (9投票s)

2007年2月13日

CPOL

4分钟阅读

viewsIcon

88587

关于双时间数据库设计所涉及概念的概述。

引言

我更多的是一个开发者,而不是一个 DBA,所以这只是一个基本概述。我一直在研究双时态表,发现很难找到任何用简单术语描述该主题的信息。所以这里是一个关于它的基本例子...

双时态数据库设计是一种存储时间依赖性数据记录的方法,以表示事实的历史和数据库中记录更改的历史。双时态数据库允许在两个正交的时间维度上进行查询:有效时间和事务时间。有效时间是指事实在现实中生效的时间。事务时间表示记录在数据库中生效的时间。

目录

  1. 时态表(建模有效时间)
  2. 示例 1 - 时态表
  3. 双时态表(建模有效时间和事务时间)
  4. 示例 2 - 双时态表

时态表(建模有效时间)

大多数数据库查询只关心现在的数据,例如“商品的价格是多少?”。处理诸如“去年 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 日:初始帖子
© . All rights reserved.