我正在研究一个用例,在这个
中考虑创建用户,标记和发布节点。
分享帖子时:
我认为以这种方式添加关系有助于按用户或标签检索帖子。
非常频繁地创建帖子。
我的担忧: 我觉得这种方法会为每个帖子创建大量数据(帖子节点以及与标签和其他用户的关系)。此外,认为数据将随着帖子的共享而快速增长,并认为每个帖子创建都是一项昂贵的操作。
你认为这种方法还不错还是有更好的方法?
答案 0 :(得分:2)
需要注意的一个问题是,当你创建一个关系时,Neo4j会锁定两端的节点 http://neo4j.com/docs/stable/transactions-locking.html 这意味着在创建帖子并将其发送给20个用户和20个标签的事务期间,事务必须在每个用户和标记节点上获取写锁定。尝试将节点链接到任何节点的其他事务将阻塞,从而导致争用。由于许多锁是以非确定性顺序获取的,这有时会导致死锁,从而导致Neo4j抛出异常并中止事务。由于帖子是非常频繁地创建的,这可能会导致问题。 (我在类似的数据模型中遇到过这个问题。)
答案 1 :(得分:1)
通过有意义的关系将许多节点链接在一起是一个很好的设计,因为它充分发挥了neo4j的优势。如果您的应用程序需要知道这些关系,那么您的设计听起来像一个体面的。你还有其他选择;例如,如果您想知道帖子有哪些标签,您可以将标签存储为帖子上节点属性内的字符串数组。这样做的好处是可以很容易地维护单个帖子的标签。如果你想查询标记为"烹饪"的所有帖子,那将会有一个很大的缺点。它会慢得多,因为你必须搜索任何一个名为" tag"含有一定的价值。
您的疑虑"创建大量数据"和"创建后是一项昂贵的操作"非常一般。他们可能是有效的担忧。他们可能只是担心你不应该担心。鉴于您提供的信息,我无法告诉您。
一般而言,通过节点和关系进行建模是一种很好的方法,但是您需要充分明确您的应用程序需求,并且随着时间的推移,您的可扩展性需要为问题提供真正可靠的答案。这是正确的设计"?