在 Azure DocumentDB 中跨集合重复相同的数据

Repeating same data across collections in Azure DocumentDB

在使用 DocumentDb 设计对话系统时,为所有相关方重复对话细节是个好主意吗?

我使用用户名的第一个字母实现了分片。现在用户 A 向 F、I 和 Z 发送消息。由于这些用户属于不同的集合(由于分片),消息详细信息在每个集合中重复。这种设计帮助我快速阅读(它会很快,因为我只需要去一个位置来显示历史)。但是写作可能很乏味,因为我必须写到多个位置。

所以,我的问题是,在使用 DocumentDb 构建此类系统时,我们可以重复细节吗?还是集中收集详细信息并维护每个用户集合的 id 部分是个好主意?

请帮忙。

谢谢, 索玛。

您所说的类似于完全规范化和部分非规范化数据建模之间的权衡,尽管由于不同的收集问题,这也不是完美的选择。也就是说,我认为关于反规范化的答案在这种情况下成立,"It depends."

您指出阅读速度更快,您的想法是正确的。

不过,我的建议是不要反规范化,除非您从生产中获得证据表明完全规范化的速度不够快,并且从实验中证明非规范化的速度更快。每次非规范化都会增加数据损坏的风险,解决此类错误是出了名的棘手。您是否尝试过将其存储在一个地方?够快吗?您是否做过让您认为这种反规范化更快的实验?

此外,我对这种情况下的性能有相反的直觉。如果您必须发出两个查询并且它们命中不同的集合而不是一个,我希望您的吞吐量会增加并且组合操作对的延迟会下降,假设您 运行 它们是并行的。

在我看来,您正在按用户进行分区,这是否适合通过对话按 Id 进行分区?然后您可以跟踪 userId 上的对话。将需要一个额外的电话来获取对话 ID,但是一旦你有了它,你就应该准备好了。