0

我有一个这样的图表:

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
...

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

  • 它使用最少的存储空间,而不包括能够获得最新的图表(我不关心以前的实时图表)
  • 应该可以研究图形演变(事物变化的速度等)

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

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

4

1 回答 1

0

我想你正在看这样的东西:

在此处输入图像描述

SNAPSHOT_VER(“版本”)随着每个新快照单调递增。每个新快照都是一个增量,相对于前一个快照添加或删除节点和边:

  • 添加新节点/边时,您只需创建一个新的 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 中)上的复合索引,以便在这两种情况下都具有良好的性能。

于 2012-08-21T03:32:27.963 回答