我想为个人资料互动设计一个模型,例如A< - >互动< - > B,交互包含A和B的公共字段
假设我有一个名为Interactions的集合,我心里想的很少,我正在寻找最佳实践解决方案。
将交互分为两个不同的文档,每个文档对应一个
{
pid:"A ID"
commonField1:""
commonField2:""
..
}
{
pid:"B ID"
commonField1:""
commonField2:""
..
}
专业人士:快速阅读
缺点:应在两个文档上执行公共字段的每次更新 维护一个文档以进行交互
{
pids:['A ID','B ID']
commonField1:""
commonField2:""
..
}
专业人士:只更新公共字段一次 缺点:棘手的阅读
事情是有很多阅读,但也有很多更新,这个集合应该是为数以百万计的文档设计的。
我的方案中的常见查询:
我倾向于第二种选择,我将依赖于快速文档查找的pid上的Multikey索引,我将在每次频繁更改时享受单次更新。
我没有分片收藏的经验,但我注意到不支持Multikey索引作为分片键,它应该是第二选择的显示停止吗?
用那种索引读取的速度是否足够快?我的用例是否还有其他选择?
非常感谢您的回答。
答案 0 :(得分:0)
我认为后一种格式更有意义,可以避免重复更新。
对于交互对,您应该使用compound index而不是数组。复合索引可以用于_id
和作为分片键(数组对两者都无效)。
因此文档可能类似于:
{
_id: { pid1: 'A', pid2: 'B' },
commonField1: '',
commonField2: '',
}
如果您想避免重复对,可以按照可预测的顺序对ID进行排序。例如,pid1
可能总是两个值中较小的一个。
默认的_id
索引将允许您有效地查找(pid1,pid2)或(pid1)交互,但您可能希望在{'_id.pid2': 1}
上添加额外的索引。