我使用Neo4j构建社交网络,其中包括:
节点标签:User
,Post
,Comment
,Page
,Group
关系:LIKE
,WRITE
,HAS
,JOIN
,FOLLOW
,......
就像Facebook一样。
示例:A user
关注B user
:当B
执行诸如发帖,评论等操作时,请关注其他用户,关注页面,加入群组等,以便采取相应措施已发送至A
。类似地,关注C
的{{1}},D
,E
用户将收到相同的通知。
我不知道如何为这个问题设计数据模型,我有一些解决方案:
B
个节点。如果执行了某项操作,请为Notification
关注者创建n
通知。好处:我们可以检查这个用户是否看过通知,对吧?但是,节点数量迅速增加,功率为n
。答案 0 :(得分:3)
我认为最好的方法是选项1.正如您所说,您将能够知道关注者是否已阅读通知。关于跟随者的通知节点的数量:这个问题被称为"超级节点"或者"密集节点" - 具有太多连接的节点。
“学习Neo4j”一书(作者Rik Van Bruggen,可用于download in the Neo4j's web site)谈论"密集节点"或者"超级节点"并说:
" [超级节点]成为图遍历的真正问题,因为图形 数据库管理系统将不得不评估所有连接的 与该节点的关系,以确定下一步 将在图表遍历中。"
本书提出了一个解决方案,包括在关注者和通知之间添加元节点(在您的情况下)。这个元节点最多应该有一百个连接。如果当前元节点达到100个连接,则必须创建一个新的元节点并将其添加到层次结构中,根据图中的示例,显示一个受欢迎的艺术家和粉丝的示例:
我想你现在不担心。如果将来您的关注者节点成为问题,那么您将能够重构数据库模式。但是现在保持简单!
在一系列名为"Building a Twitter clone with Neo4j"的帖子中,Max de Marzi描述了构建模型的过程。也许它可以帮助您做出关于您的模型的最佳决策!