鉴于 ElasticSearch NoSQL 数据库,我试图弄清楚如何最好地对社交关系数据建模(是的,图形数据库将是这项工作的最佳工具,但在我目前的情况下,这个选择可能会强加给我)。
我是 ElasticSearch 的新手,并且正在审查建模关系的方法,但它们似乎不适合社交关系的用例,或者至少我不清楚这些将如何建模。
我的要求的一个大大简化的版本如下:
- 人们有身份证、姓名和工作地点(他们可能没有工作地点)
- 人们可以与其他人建立友谊关系(以及建立友谊的日期)
- 人们可以阻止其他人与他们交谈(方向性很重要,因为只有阻止的人才能解除阻止)
- 人们可以在同一个工作地点工作
我们可能会查询的内容:
- 把我所有的朋友都给我(给定我的ID)
- 给我所有与我一起工作的人(给定我的 ID)
- 给我上面2个的union,以及他们工作地点的名字和id,而不是那些我屏蔽过或者屏蔽过我的人。
- 给我所有在我工作的城市有工作地点的朋友。
虽然查询看起来可能是一个挑战,但我更感兴趣的是在 ElasticSearch 中简单地对人员、工作场所以及它们之间的关系进行建模,使其有意义、可维护并且可以支持此类查询.
文档告诉我 ElasticSearch 没有连接。它有嵌套对象和父子关系,但这些似乎都不适合人与人之间的友谊关系;嵌套对象和父子对象都有一个隐含的单一所有权概念......除非我开始在任何地方复制人员数据,无论是在其他人对象(对于朋友和被阻止)还是在工作场所。这当然引入了保持数据一致的问题,因为更改人员数据需要在各处更改他们的重复数据,并且删除友谊关系必须删除该关系的另一方与另一个人。这也带来了事务的问题,因为我听说不支持跨不同文档的事务支持。
除了非规范化和复制,或数据库之外的应用程序端连接之外,有没有更好的方法(除了使用不同的数据库)以更容易查询的合理方式对此进行建模?