微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在MongoDB中为高度相关的数据建模

如何解决如何在MongoDB中为高度相关的数据建模

我在MongoDB中进行数据建模时遇到问题。文档似乎并未提出适合我的解决方案。

我的特殊用例与Facebook好友系统非常相似。 我收藏了 用户和每个用户都可以通过发送被接受或拒绝的邀请与其他用户建立联系。该机制将为其他功能(例如计算共同的朋友,推荐最合适的朋友等)奠定基础。

貌似受欢迎的解决方案是

  • 将朋友的id嵌入用户文档中作为数组
  • 用户数据作为数组嵌入到用户文档中

但是这是有问题的-如果某人有几千个朋友,那么性能将受到损害,并且性能对我很重要。

我的想法是创建单独的集合,其中每个文档都是两个用户间的连接。该文档可以包含每个用户的嵌入数据和足够的其他数据,例如连接邀请的状态。您如何看待这种设计?

此外,当性能至关重要时,在MongoDB中是否有任何经过实践检验的方法来处理这种情况?我也乐于接受其他数据库建议,我在考虑图形数据库

解决方法

这种用例很容易在neo4j之类的图形数据库中进行处理。

例如,您可以使用neo4j的Cypher语言存储用户123创建邀请并将其发送给许多用户的事实:

MATCH (u:User {id: 123})
CREATE (u)-[:CREATED]->(i:Invitation {id: 999,text: '...',date: ...,location: ...})
UNWIND [234,345,456] AS inviteeId
MATCH (u1:User {id: inviteeId})
CREATE (i)-[:INVITED]->(u1)

每当用户响应时,您都可以像这样存储它:

MATCH (u:User {id: 345}),(i:Invitation {id: 999})
CREATE (u)-[:RESPONDED {accept: false}]->(i)

最后,要查看接受任何用户123邀请的不同用户:

MATCH (u:User {id: 123})-[:CREATED]->(:Invitation)<-[:RESPONDED {accept: true}]-(acceptor:User)
RETURN DISTINCT acceptor

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。