问题描述
我在MongoDB中进行数据建模时遇到问题。文档似乎并未提出适合我的解决方案。
我的特殊用例与Facebook好友系统非常相似。 我收藏了 用户和每个用户都可以通过发送被接受或拒绝的邀请与其他用户建立联系。该机制将为其他功能(例如计算共同的朋友,推荐最合适的朋友等)奠定基础。
貌似受欢迎的解决方案是:
但是这是有问题的-如果某人有几千个朋友,那么性能将受到损害,并且性能对我很重要。
我的想法是创建单独的集合,其中每个文档都是两个用户之间的连接。该文档可以包含每个用户的嵌入数据和足够的其他数据,例如连接邀请的状态。您如何看待这种设计?
此外,当性能至关重要时,在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