Database design Neo4j/保存节点更改历史记录的策略

Database design Neo4j/保存节点更改历史记录的策略,database-design,graph,neo4j,uuid,graph-databases,Database Design,Graph,Neo4j,Uuid,Graph Databases,让我们假设一个关于汽车的图表。 每辆汽车都会随着时间的推移而变化,我需要跟踪这些变化。 (为了能够跟踪某些不一致的进化等…) 我考虑实现一个写时拷贝机制(似乎是这样),这意味着每次汽车的一个属性发生变化时,都要创建一个全新的汽车节点 我会得到这样一张图: (Ferrari)-[:CURRENT]->(V3)-[:PREVIOUS]->(V2)-[:PREVIOUS]->(V1) 我对检索最新的版本特别感兴趣,所以听起来不错 但是,如何处理初始的CarUUID MyCar的UU

让我们假设一个关于汽车的图表。
每辆
汽车都会随着时间的推移而变化,我需要跟踪这些变化。
(为了能够跟踪某些不一致的进化等…)

我考虑实现一个写时拷贝机制(似乎是这样),这意味着每次
汽车的一个属性发生变化时,都要创建一个全新的
汽车
节点

我会得到这样一张图:

(Ferrari)-[:CURRENT]->(V3)-[:PREVIOUS]->(V2)-[:PREVIOUS]->(V1)
我对检索最新的版本特别感兴趣,所以听起来不错

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

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

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

因此,我知道检索特定版本的唯一方法是遍历图的相关部分,直到找到正确的部分,而不是依赖于对初始UUID的简单查询;通过一个简单的密码查询,这看起来仍然非常高效和简单

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

您应该有两种类型的节点(具有不同的标签)——汽车节点(如您问题中的“法拉利”)和卡弗森节点(如Vn节点)。只有Car节点应该包含UUID。所有其他车辆数据都应进入CarVersion节点


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

>“为了确保UUID是唯一的,并加快获取特定汽车节点的速度”=>约束如何使查询更快???@Mik378保存不会更快,因为它需要检查UUID是否已经存在,但检索UUID可能更快,因为neo4j知道它只能是一个UUID。但我不知道neo4j是如何实现的,这种微观优化还为时过早,除非您分阶段进行其他优化,并且您的查询仍然很慢。@user974731我理解。我将根据您的解决方案,制作
Car
对象的
CarVersion
s值对象<代码>汽车
将只包含
id
字段(UUID)和
设置[CarVersion]
CarVersion
包含所有其他
Car
数据创建唯一性约束会自动创建相应的索引(因为这是检查唯一性的最快方法)。因此,通过UUID进行匹配只需要索引查找。