2016-07-09 38 views
0

鉴于ElasticSearch NoSQL数据库,我试图找出如何最好地建模社交关系数据(是的,图形数据库将是这项工作的最佳工具,但在我目前的情况下,这种选择可能会强加给我) 。如何建模ElasticSearch中的社交连接?

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

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

  • 人都有编号,名称和工作地点(他们可能没有一个工作的地方)
  • 人们可以与其他人的友谊关系(和友谊创造的日期)
  • 人可以阻止其他人谈论他们(方向性的问题,因为只有谁能够阻止解锁一个)
  • 人们可以在同一工作场所
  • 工作

的事情,我们很可能会查询:

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

虽然查询看起来他们可能是一个挑战,我更感兴趣的是简单的造型的人,工作场所,并在ElasticSearch在这样一种方式,它是有道理它们之间的关系,为维护和这可以支持这些查询。

文档告诉我ElasticSearch没有连接。它具有嵌套对象和父子关系,但这两者似乎都不适合人与人之间的友谊关系;嵌套对象和父子都具有单一所有权的隐含概念......除非我开始在其他人员对象(用于朋友和被阻止)以及在工作场所中复制人员数据。这当然会引入保持数据一致性的问题,因为变化的人员数据需要在任何地方更改其复制的数据,并且消除友谊关系必须消除与其他人的关系的另一方。这也带来了交易问题,因为我听说不支持跨不同文档的交易支持。

除了非规范化和重复,或db外的应用程序端连接,还有没有更好的方法(除了使用不同的数据库)以一种比较容易查询的理智模式进行建模?

回答

1

样品简化JSON一些解释之后:

{ “类型”: “人”, “ID”:1, “名”: “InverseFalcon”, “职场”: “StackOverflow上” , “friend_ids”:[3,4,19], “blocked_ids”:[45,24], “blocked_by_ids”[5]: }

这应该是快如闪电,你可以检索文档,工作你的集合(union,intersection等),然后执行multi-get(mget)来检索名字和工作流地点。不使用图形数据库意味着递归调用以获得朋友的朋友等。