ArangoDB:有几个大集合 vs. 很多小集合
ArangoDB: having a few large collections vs. a lot small collections
我有一个关于 performance/best 练习的问题:
场景: 我有一个用户集合和一个聊天机器人集合。他们可以是用户集合中的很多用户(比如说 100 -1000 个用户)。每个用户可以有多个聊天机器人(每个用户大约 10 个)。
选项 A: 我创建了一个边缘集合来定义用户 -> 聊天机器人之间的连接。最后我会有 1 个用户集合、1 个聊天机器人集合(包含所有用户的所有聊天机器人)和 1 个边缘集合(包含用户对其聊天机器人的定义)
选项 B: 我为每个用户创建一个单独的聊天机器人集合,将特定用户的所有聊天机器人放在一个地方。聊天机器人集合名称将是例如user_xyz(user._key)_聊天机器人。因此,如果我需要具有 _key ‘abc’ 的用户的所有聊天机器人,我会检查集合 user_abc_chatbots。在这种情况下,我不需要连接用户 -> 聊天机器人的边缘集合。最后我会有 1 个用户集合和很多 user_xyz_chatbots-collections(取决于我有多少用户 - 可以像我之前写的那样是 100-1000)。
现在我的问题是:什么是更好的选择?关于性能 - 图片我每次收到请求时都必须获取用户的所有(或特定)聊天机器人。
如果您能就您的 experience/thoughts 给我反馈,那就太好了 :)
查看您发布的数字,即 100 - 1000 个用户和每个用户大约 10 个聊天机器人,这意味着总共只有 1000 到 10000 个聊天机器人。
对于这个数据维度,我认为将所有聊天机器人存储在一个集合中并使用(索引)属性存储每个聊天机器人的用户 ID 更有意义。这是一个 1:n 关系(1 个用户映射到 n 个聊天机器人)
这样您就可以轻松且快速地找到映射到特定用户的所有聊天机器人,但此设置还允许您轻松地对所有用户或所有聊天机器人进行分析。
如果每个用户的聊天机器人位于不同的集合中,这将很难实现。
此外,如果可以将相同的聊天机器人映射到多个用户,则使用三个集合实际上可能有意义:
- 用户合集
- 一个聊天机器人合集
- 以及一个用户和聊天机器人之间的映射集合
这将是一个n:m关系,其中每个用户仍然可以映射到任意数量的聊天机器人,但如果多个用户映射到同一个聊天机器人,则每个聊天机器人的数据不需要冗余存储。
如果每个聊天机器人都有独立的数据结构,并且需要特殊的索引或查询,我只建议为每个用户使用单独的聊天机器人集合。在这种情况下,将不同的聊天机器人分开可能是有意义的。
但是,集合太多(这里我们认为最多 1,000 个)也不是很好,因为每个集合即使是空的也会有很小的开销。如果有更少的更频繁使用的集合比有许多很少使用的集合时,这会更好地摊销。
我有一个关于 performance/best 练习的问题:
场景: 我有一个用户集合和一个聊天机器人集合。他们可以是用户集合中的很多用户(比如说 100 -1000 个用户)。每个用户可以有多个聊天机器人(每个用户大约 10 个)。
选项 A: 我创建了一个边缘集合来定义用户 -> 聊天机器人之间的连接。最后我会有 1 个用户集合、1 个聊天机器人集合(包含所有用户的所有聊天机器人)和 1 个边缘集合(包含用户对其聊天机器人的定义)
选项 B: 我为每个用户创建一个单独的聊天机器人集合,将特定用户的所有聊天机器人放在一个地方。聊天机器人集合名称将是例如user_xyz(user._key)_聊天机器人。因此,如果我需要具有 _key ‘abc’ 的用户的所有聊天机器人,我会检查集合 user_abc_chatbots。在这种情况下,我不需要连接用户 -> 聊天机器人的边缘集合。最后我会有 1 个用户集合和很多 user_xyz_chatbots-collections(取决于我有多少用户 - 可以像我之前写的那样是 100-1000)。
现在我的问题是:什么是更好的选择?关于性能 - 图片我每次收到请求时都必须获取用户的所有(或特定)聊天机器人。
如果您能就您的 experience/thoughts 给我反馈,那就太好了 :)
查看您发布的数字,即 100 - 1000 个用户和每个用户大约 10 个聊天机器人,这意味着总共只有 1000 到 10000 个聊天机器人。
对于这个数据维度,我认为将所有聊天机器人存储在一个集合中并使用(索引)属性存储每个聊天机器人的用户 ID 更有意义。这是一个 1:n 关系(1 个用户映射到 n 个聊天机器人)
这样您就可以轻松且快速地找到映射到特定用户的所有聊天机器人,但此设置还允许您轻松地对所有用户或所有聊天机器人进行分析。
如果每个用户的聊天机器人位于不同的集合中,这将很难实现。
此外,如果可以将相同的聊天机器人映射到多个用户,则使用三个集合实际上可能有意义:
- 用户合集
- 一个聊天机器人合集
- 以及一个用户和聊天机器人之间的映射集合
这将是一个n:m关系,其中每个用户仍然可以映射到任意数量的聊天机器人,但如果多个用户映射到同一个聊天机器人,则每个聊天机器人的数据不需要冗余存储。
如果每个聊天机器人都有独立的数据结构,并且需要特殊的索引或查询,我只建议为每个用户使用单独的聊天机器人集合。在这种情况下,将不同的聊天机器人分开可能是有意义的。
但是,集合太多(这里我们认为最多 1,000 个)也不是很好,因为每个集合即使是空的也会有很小的开销。如果有更少的更频繁使用的集合比有许多很少使用的集合时,这会更好地摊销。