我对性能/最佳实践有疑问:
场景:我有一个用户集合和一个聊天机器人集合。他们在用户集合中可以是很多用户(比如说100 -1000个用户)。每个用户可以有多个聊天机器人(每个用户约10个)。
选项A:我创建了一个边缘集合来定义用户-> chatbot之间的连接。最后,我将有1个用户集合,1个chatbot集合(包含来自所有用户的所有chatbot)和1个edge-collection(包含从用户到其聊天机器人的定义)
选项B::我为每个用户创建一个单独的聊天机器人集合,以将特定用户的所有聊天机器人都放在一个地方。 Chatbot集合名称为user_xyz(user._key)_chatbots。因此,如果我需要一个带有_key'abc'的用户的所有聊天机器人,我将检查集合user_abc_chatbots。在这种情况下,我不需要连接用户-> chatbot的边缘收集。最终,我将有1个用户集合和许多user_xyz_chatbots-集合(取决于我拥有的用户数量-可以是我之前写的100-1000个用户。)
现在我的问题:什么是更好的选择?另外还涉及性能-图片每次收到请求时,我都必须获得用户的所有(或特定)聊天机器人。
如果您能给我有关您的经验/想法的反馈,那就太好了
答案 0 :(得分:1)
看看您发布的数字,即100-1000个用户和每个用户约10个聊天机器人,这意味着总共只有1000到10000个聊天机器人。
对于这种数据维度,我想说的是将所有聊天机器人存储在一个集合中,并使用(索引)属性存储每个聊天机器人的用户ID更为有意义。这是1:n关系(1个用户映射到n个聊天机器人)
这样,您可以轻松且仍然快速地找到映射到特定用户的所有聊天机器人,但是此设置还可以使您轻松地对所有用户或所有聊天机器人进行分析。
如果每个用户的聊天机器人位于不同的集合中,则实现起来将更加困难。
此外,如果可以将同一个聊天机器人映射到多个用户,则实际上可以使用三个集合:
这将是n:m关系,其中每个用户仍可以映射到任意数量的聊天机器人,但是如果多个用户映射到同一聊天机器人,则不需要冗余存储每个聊天机器人的数据。
如果每个聊天机器人都具有与所有其他聊天机器人分开的单独的数据结构,并且需要特殊的索引或查询,则我建议仅对每个用户使用单独的聊天机器人集合。在这种情况下,分离不同的聊天机器人可能很有意义。
但是,有太多的集合(在这里我们最多可以想到1,000个)也不是一件好事,因为每个集合即使在空的情况下也有很小的开销。如果使用较少的收藏集比使用很少的收藏集多,那么摊销会更好。