【问题标题】:Neo4J:Data Modelling - Creating too many relationshipsNeo4J:数据建模 - 创建太多关系
【发布时间】:2014-04-14 10:27:06
【问题描述】:

我正在研究一个用例,在这个

  • 有用户。
  • 有标签。
  • 用户与其他用户分享帖子(内容)。并且每个帖子都连接到多个标签。

考虑创建 User、Tag 和 Post 节点。

分享帖子时:

  • 在 Post 节点和 User 节点之间添加了关系(与谁共享帖子,最多可以有 20 个用户)。
  • 在帖子节点和帖子创建者之间添加了关系。
  • 在 Post 节点和 Tag 节点之间添加关系(最多可以有 20 个标签)

我认为以这种方式添加关系有助于按用户或标签检索帖子。

帖子的创建非常频繁。

我的担心: 我觉得这种方法会为每个帖子创建大量数据(帖子节点以及与标签和其他用户的关系)。此外,认为随着帖子的共享,数据会增长得非常快,并认为每次创建帖子都是一项昂贵的操作。

您认为这种方法好还是有更好的方法?

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    需要注意的一个问题是,当您创建关系时,Neo4j 会锁定两端的节点。
    http://neo4j.com/docs/stable/transactions-locking.html 这意味着在您创建帖子并将其发送给 20 个用户和 20 个标签的事务期间,该事务必须在每个用户和标签节点上获取一个写锁。尝试将节点链接到其中任何一个的其他事务将阻塞,从而导致争用。由于许多锁是以不确定的顺序获取的,这有时会导致死锁,从而导致 Neo4j 抛出异常并中止事务。由于帖子创建非常频繁,这可能会导致问题。 (我在类似的数据模型中遇到过这个确切的问题。)

    【讨论】:

      【解决方案2】:

      通过有意义的关系将许多节点连接在一起是一个很好的设计,因为它发挥了 neo4j 的优势。如果您的应用程序需要了解这些关系,那么您的设计在我看来是一个不错的设计。您确实有其他选择;例如,如果您想知道帖子有哪些标签,您可以将标签作为字符串数组存储在帖子的节点属性内。这将具有使维护单个帖子的标签变得非常容易的优点。它的一个很大的缺点是,如果您想查询所有标记为“烹饪”的帖子,它会慢得多,因为您必须搜索具有包含特定值的称为“标签”的属性的任何节点。

      您对“创建大量数据”和“创建帖子是一项昂贵的操作”的担忧非常普遍。它们可能是合理的担忧。它们可能只是您不应该担心的担忧。鉴于您提供的信息,我无法判断。

      一般来说,通过节点和关系进行建模是一种很好的方法,但是您需要清楚地了解您的应用程序需求,并且随着时间的推移,您的可扩展性需要为“这是正确的”这个问题提供一个真正可靠的答案设计”?

      【讨论】:

      • 谢谢。我想我想查询所有带有特定标签的帖子,所以,我认为最好与标签建立关系。
      • 关于使这种方法可扩展的任何高级建议?我在想的一种方法是在每个位置复制相同的标签,而不是使用全局标签
      • 可扩展性有很多种——你指的是哪一种?扩展到许多读取查询,扩展到许多新帖子,扩展到大量整体数据等。顺便说一句,拥有全局标签的缺点是,如果一个被编辑,与所有帖子关联的标签会自动更改。
      • 我认为我的应用程序需求是扩展到许多读取查询并扩展到许多新帖子。应用程序被不同城市/国家的人们使用。标签在世界各地都很常见,但我认为用户与位置有关。
      • 另外,考虑创建位置节点并将用户节点连接到位置节点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多