Neo4J - 哪个更好地将元素存储为用户的属性或节点&关系?

时间:2018-04-12 03:43:45

标签: neo4j query-optimization nodes

在设计拥有数百万用户的图表模型时遇到了问题。我需要存储用户注册或未注册的信息。 我认为我们有两个选择:

  1. 在每个用户节点中存储属性“ register = true / false ”。因此,对于100万用户,我们有100万个属性“注册”。
  2. 存储已注册节点,然后仅为注册用户与此节点建立关系。因此,我们的关系数量与注册用户完全相同。
  3. 哪种选项在性能搜索方面也最好还有最小存储空间?

    提前致谢,

1 个答案:

答案 0 :(得分:1)

将数据建模为图表是一件难以准确确定的事情。通常,对于NoSQL数据库,最重要的是要考虑如何使用数据,并根据数据对其进行建模。

使用外部节点可能会遇到性能问题,因为Neo4J在遍历期间通常会遇到问题,因为它在单个节点中接近10,000个关系。通过外部"注册"您将远远超过该限制。节点;另一方面,只要您没有将搜索锚定到该节点,它应该没问题。

无论你去哪条路线,你在评论中描述的查询都可能会锚定(开始)用户,然后遍历他们的朋友,然后对于每个朋友,它会检查是否

一个。已注册"注册"属性设置为' true' B.与注册"有关系。节点

这些方法中的每一种似乎都具有相似的执行时间,并且在"注册的"属性的影响可以忽略不计,因为它没有被用作锚点(大概是你必须用PROFILE两种方法查询你的查询才能确定。所以,就像你提到的那样,人们可能会考虑空间限制。

除此之外,从我可以看到的两种方法的性能分析角度来看,没有太大区别。

@InverseFalcon提到的第三个选项是使用额外的标签,':已注册'在那些已注册的节点上。这可能导致比将其保留在属性中更快的比较时间,因为标签将在节点存储中内联并且可以在那里进行检查,而属性可能具有额外的间接到属性存储的级别。