我如何在 ElasticSearch 中为社交关系建模?
How can I model social connections in ElasticSearch?
考虑到 ElasticSearch NoSQL 数据库,我正在尝试弄清楚如何最好地模拟社会关系数据(是的,图形数据库将是这项工作的最佳工具,但在我目前的情况下,这个选择可能是被迫的在我身上)。
我是 ElasticSearch 的新手,正在研究建立关系模型的方法,但它们似乎不适合社交关系的用例,或者至少对我来说这些模型的建立方式并不明显。
我的要求的一个大大简化的版本如下:
- 人们有身份证、姓名和工作地点(他们可能没有工作地点)
- 人们可以与其他人建立友谊关系(以及建立友谊的日期)
- 人们可以阻止其他人与他们交谈(方向性很重要,因为只有阻止的人才能取消阻止)
- 人们可以在同一个工作地点工作
我们可能查询的内容:
- 给我所有与我成为朋友的人(给定我的 ID)
- 给我所有与我一起工作的人(给定我的 ID)
- 给我上面2个的并集,还有他们单位的名字和id,我拉黑的和拉黑我的都不要。
- 在我工作的城市有工作地点的朋友都给我。
虽然查询看起来可能是一个挑战,但我更感兴趣的是在 ElasticSearch 中简单地对人、工作场所以及它们之间的关系进行建模,使其有意义、可维护并且可以支持这样的查询。
文档告诉我 ElasticSearch 没有连接。它有嵌套对象,也有父子关系,但这些似乎都不适合人与人之间的友谊关系;嵌套对象和父子对象都有一个隐含的单一所有权概念……除非我开始在其他人的对象(朋友和被阻止的对象)和工作场所中到处复制人的数据。这当然会引入保持数据一致性的问题,因为更改个人数据需要更改他们各处的重复数据,并且删除友谊关系必须删除与另一个人的关系的另一方。这也带来了交易问题,因为我听说不支持跨不同文档的交易支持。
除了非规范化和复制,或数据库外部的应用程序端连接之外,是否有更好的方法(除了使用不同的数据库)以更易于查询的合理方式对此进行建模?
示例简化 json 并在之后进行一些解释:
{
"type":"person",
"id":1,
"name":"InverseFalcon",
"workplace":"Whosebug",
"friend_ids":[3,4,19],
"blocked_ids":[45,24],
"blocked_by_ids":[5]
}
这应该快如闪电,因为您可以检索文档、处理集合(并集、交集等),然后执行多重获取 (mget) 来检索名称和工作流位置。不使用图形数据库意味着递归调用以获取朋友的朋友等
考虑到 ElasticSearch NoSQL 数据库,我正在尝试弄清楚如何最好地模拟社会关系数据(是的,图形数据库将是这项工作的最佳工具,但在我目前的情况下,这个选择可能是被迫的在我身上)。
我是 ElasticSearch 的新手,正在研究建立关系模型的方法,但它们似乎不适合社交关系的用例,或者至少对我来说这些模型的建立方式并不明显。
我的要求的一个大大简化的版本如下:
- 人们有身份证、姓名和工作地点(他们可能没有工作地点)
- 人们可以与其他人建立友谊关系(以及建立友谊的日期)
- 人们可以阻止其他人与他们交谈(方向性很重要,因为只有阻止的人才能取消阻止)
- 人们可以在同一个工作地点工作
我们可能查询的内容:
- 给我所有与我成为朋友的人(给定我的 ID)
- 给我所有与我一起工作的人(给定我的 ID)
- 给我上面2个的并集,还有他们单位的名字和id,我拉黑的和拉黑我的都不要。
- 在我工作的城市有工作地点的朋友都给我。
虽然查询看起来可能是一个挑战,但我更感兴趣的是在 ElasticSearch 中简单地对人、工作场所以及它们之间的关系进行建模,使其有意义、可维护并且可以支持这样的查询。
文档告诉我 ElasticSearch 没有连接。它有嵌套对象,也有父子关系,但这些似乎都不适合人与人之间的友谊关系;嵌套对象和父子对象都有一个隐含的单一所有权概念……除非我开始在其他人的对象(朋友和被阻止的对象)和工作场所中到处复制人的数据。这当然会引入保持数据一致性的问题,因为更改个人数据需要更改他们各处的重复数据,并且删除友谊关系必须删除与另一个人的关系的另一方。这也带来了交易问题,因为我听说不支持跨不同文档的交易支持。
除了非规范化和复制,或数据库外部的应用程序端连接之外,是否有更好的方法(除了使用不同的数据库)以更易于查询的合理方式对此进行建模?
示例简化 json 并在之后进行一些解释:
{ "type":"person", "id":1, "name":"InverseFalcon", "workplace":"Whosebug", "friend_ids":[3,4,19], "blocked_ids":[45,24], "blocked_by_ids":[5] }
这应该快如闪电,因为您可以检索文档、处理集合(并集、交集等),然后执行多重获取 (mget) 来检索名称和工作流位置。不使用图形数据库意味着递归调用以获取朋友的朋友等