鉴于ElasticSearch NoSQL数据库,我试图弄清楚如何最好地建模社交关系数据(是的,图表数据库将是这项工作的最佳工具,但在我目前的情况下,这种选择可能会被迫在我身上。)
我是ElasticSearch的新手,正在审查建立关系模式的方法,但它们似乎不适合社交关系的用例,或者至少对我来说不是很明显这些将被建模。
我的要求的大大简化版本如下:
我们可能会查询的内容:
虽然查询看起来可能是一个挑战,但我更感兴趣的是简单地在ElasticSearch中对人员,工作场所以及它们之间的关系进行建模,使其有意义,可维护,并且可以支持这样的查询。
文档告诉我ElasticSearch没有加入。它有嵌套的对象和父子关系,但这些都不适合人们之间的友谊关系;嵌套对象和父子都有一个隐含的单一所有权概念......除非我开始在其他人对象(对于朋友和被阻止的)和工作场所中复制人数据。这当然引入了保持数据一致的问题,因为改变人员数据需要在任何地方改变他们的重复数据,并且删除友谊关系必须从另一个人移除该关系的另一方。这也带来了交易问题,因为我听说不支持不同文件的交易支持。
除了非规范化和重复,或者在数据库之外的应用程序端连接之外,还有更好的方法(除了使用不同的数据库)以更加容易查询的理智方式对其进行建模吗?
答案 0 :(得分:1)
示例简化了json,后面有一些解释:
{ "类型":"人&#34 ;, " ID":1, "名称":" InverseFalcon&#34 ;, "工作场所":" StackOverflow的&#34 ;, " friend_ids":[3,4,19] " blocked_ids":[45,24], " blocked_by_ids":[5] }
这应该是快速的,因为您可以检索文档,处理您的集合(联合,交集等),然后执行多重获取(mget)来检索名称和工作流程位置。不使用图形数据库意味着递归调用以获取朋友的朋友等。