让我们假设一个处理汽车的图。
每个 Car 都可以随着时间的推移而发展,我需要跟踪这些变化。
(为了能够跟踪进化的一些不一致等......)

我想过实现 写时复制 机制(就像 LinkedIn 似乎做的那样),这意味着每次 Car 的属性发生变化时都会创建一个完整的新 Car 节点。

我最终会得到这样的图表:

(Ferrari)-[:CURRENT]->(V3)-[:PREVIOUS]->(V2)-[:PREVIOUS]->(V1)

我对检索最新版本特别感兴趣,所以听起来不错。

但是,如何处理初始的Car UUID?

我的 Car 的 UUID(这是一个用于简化查询的索引属性)是通过库 (Apache) 自动生成的。
我想如果我为每个 Car 版本保留相同的初始 UUID,这可能会导致一些冲突:“检索 UUID 为 123 的 Ferrari”=> 返回多个结果。如果 3 个版本,则为 3 个结果。

为每个版本生成一个新的品牌 UUID 是否安全高效?

因此,我知道在这种情况下,检索特定版本的唯一方法是遍历图形的相关部分直到正确的部分,而不是依靠对初始 UUID 的简单查询;使用简单的 Cypher 查询,这似乎仍然非常有效和容易。

我想保留生成的 UUID,因为不建议使用潜在的“可猜测”REST URL(因此使用资源的 UUID)。
事实上,我可以有一个 UUID 作为 Car 模型与其版本之间的组合,但它似乎不够“安全”,我的 URLS 可见。任何恶意的人都可以通过更改 URL 轻松地设法检索旧版本。

最佳答案

您应该有 2 种类型的节点(具有不同的标签)——Car 节点(如问题中的“Ferrari”)和 CarVersion 节点(如 Vn 节点)。只有 Car 节点应该包含 UUID。所有其他汽车数据都应该放在 CarVersion 节点中。

此外,为了确保 UUID 是唯一的并加快获取特定 Car 节点的速度,您可以对 Car 节点的 UUID 属性创建唯一性约束。

关于database-design - Neo4j/保持节点更改历史的策略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22073512/

10-16 16:19