在数据库中存储时变图

时间:2012-08-12 22:11:21

标签: sql sql-server sql-server-2008 database-design time-series

我有一个这样的图表:

Source | Sink | Timestamp
A        B      2012-08-01 03:02:00
B        C      2012-08-01 03:02:00
C        D      2012-08-01 03:02:00
...

我正在从另一个表构建此表。我想设计我的表,以便:

  • 它使用最小存储而不包括能够获取最新图形(我不关心实时场景的先前图形)
  • 应该可以研究图形演变(变化有多快等等)。

目前,除了存储SourceSinkTimestamp之外,没有其他优化措施。考虑到每个快照包含800K链接,因此无法完整存储图形,因此我正在寻找可能基于delta的方法。关于如何解决这个问题的任何建议?

图表本身是高度动态的,即可以在每个快照中添加或删除节点和链接。

1 个答案:

答案 0 :(得分:0)

我认为你正在看这样的事情:

enter image description here

SNAPSHOT_VER(“version”)随每个新快照单调递增。每个新快照都是增量或删除相对于上一个快照的节点和边缘的增量:

  • 添加新节点/边时,只需创建一个新的SNAPSHOT并将其SNAPSHOT_VER用于NODE.CREATED_VER和EDGE.CREATED_VER。暂时将DELETED_VER保留为NULL。
  • 删除节点/边缘时,只需根据删除它们的快照设置DELETED_VER。

在查询给定快照中存在的图形时,您应该可以这样做:

SELECT *
FROM NODE
WHERE
    CREATED_VER <= @snapshot_ver
    AND (DELETED_VER IS NULL OR @snapshot_ver < DELETED_VER)

(可以为EDGE构建等效查询。)

这将获取在给定快照或更早版本中创建的所有节点,或者根本不删除或者在给定快照之后删除。

查询最新图表时,您可以简单地:

SELECT *
FROM NODE
WHERE DELETED_VER IS NULL

你可能需要{DELETED_VER,CREATED_VER DESC}(在NODE和EDGE中)的综合索引,以便在这两种情况下都能获得良好的性能。