0

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

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

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

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

我们可能会查询的内容:

  • 把我所有的朋友都给我(给定我的ID)
  • 给我所有与我一起工作的人(给定我的 ID)
  • 给我上面2个的union,以及他们工作地点的名字和id,而不是那些我屏蔽过或者屏蔽过我的人。
  • 给我所有在我工作的城市有工作地点的朋友。

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

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

除了非规范化和复制,或数据库之外的应用程序端连接之外,有没有更好的方法(除了使用不同的数据库)以更容易查询的合理方式对此进行建模?

4

1 回答 1

1

简化的 json 示例,之后有一些解释:

{ "type":"person", "id":1, "name":"InverseFalcon", "workplace":"StackOverflow", "friend_ids":[3,4,19], "blocked_ids":[45, 24],“blocked_by_ids”:[5] }

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

于 2016-07-15T13:00:13.833 回答