如何在ElasticSearch中建模社交关系?

时间:2016-07-09 04:33:26

标签: elasticsearch data-modeling social-graph nosql

鉴于ElasticSearch NoSQL数据库,我试图弄清楚如何最好地建模社交关系数据(是的,图表数据库将是这项工作的最佳工具,但在我目前的情况下,这种选择可能会被迫在我身上。)

我是ElasticSearch的新手,正在审查建立关系模式的方法,但它们似乎不适合社交关系的用例,或者至少对我来说不是很明显这些将被建模。

我的要求的大大简化版本如下:

  • 人们有身份证,姓名和工作地点(他们可能没有工作地点)
  • 人们可以与其他人建立友谊关系(以及建立友谊的日期)
  • 人们可以阻止其他人与他们交谈(方向性很重要,因为只有被阻止的人才能解除阻止)
  • 人们可以在同一个工作场所工作

我们可能会查询的内容:

  • 把我所有的朋友(给我的身份证)给予我
  • 给我所有与之合作的人(鉴于我的身份证)
  • 给我上述2的联合,以及他们工作地点的名称和ID,但不是那些我阻止或阻止我的人。
  • 给我在我工作的城市有工作地点的所有朋友。

虽然查询看起来可能是一个挑战,但我更感兴趣的是简单地在ElasticSearch中对人员,工作场所以及它们之间的关系进行建模,使其有意义,可维护,并且可以支持这样的查询。

文档告诉我ElasticSearch没有加入。它有嵌套的对象和父子关系,但这些都不适合人们之间的友谊关系;嵌套对象和父子都有一个隐含的单一所有权概念......除非我开始在其他人对象(对于朋友和被阻止的)和工作场所中复制人数据。这当然引入了保持数据一致的问题,因为改变人员数据需要在任何地方改变他们的重复数据,并且删除友谊关系必须从另一个人移除该关系的另一方。这也带来了交易问题,因为我听说不支持不同文件的交易支持。

除了非规范化和重复,或者在数据库之外的应用程序端连接之外,还有更好的方法(除了使用不同的数据库)以更加容易查询的理智方式对其进行建模吗?

1 个答案:

答案 0 :(得分:1)

示例简化了json,后面有一些解释:

{     "类型":"人&#34 ;,     " ID":1,     "名称":" InverseFalcon&#34 ;,     "工作场所":" StackOverflow的&#34 ;,     " friend_ids":[3,4,19]     " blocked_ids":[45,24],     " blocked_by_ids":[5] }

这应该是快速的,因为您可以检索文档,处理您的集合(联合,交集等),然后执行多重获取(mget)来检索名称和工作流程位置。不使用图形数据库意味着递归调用以获取朋友的朋友等。