mongoDB中的集合数据建模

时间:2014-02-06 00:11:27

标签: mongodb indexing sharding multikey

我想为个人资料互动设计一个模型,例如A< - >互动< - > B,交互包含A和B的公共字段 假设我有一个名为Interactions的集合,我心里想的很少,我正在寻找最佳实践解决方案。

  1. 将交互分为两个不同的文档,每个文档对应一个

    {
      pid:"A ID"
      commonField1:""
      commonField2:""
      ..
    
    }
    {
      pid:"B ID"
      commonField1:""
      commonField2:""
      ..
    }
    
    专业人士:快速阅读 缺点:应在两个文档上执行公共字段的每次更新

  2. 维护一个文档以进行交互

    {
     pids:['A ID','B ID']
     commonField1:""
     commonField2:""
     ..
    }
    

    专业人士:只更新公共字段一次 缺点:棘手的阅读

  3. 事情是有很多阅读,但也有很多更新,这个集合应该是为数以百万计的文档设计的。

    我的方案中的常见查询:

    • 检索个人资料互动
    • 更新特定的个人资料互动

    我倾向于第二种选择,我将依赖于快速文档查找的pid上的Multikey索引,我将在每次频繁更改时享受单次更新。

    我没有分片收藏的经验,但我注意到不支持Multikey索引作为分片键,它应该是第二选择的显示停止吗?
    用那种索引读取的速度是否足够快?我的用例是否还有其他选择?

    非常感谢您的回答。

1 个答案:

答案 0 :(得分:0)

我认为后一种格式更有意义,可以避免重复更新。

对于交互对,您应该使用compound index而不是数组。复合索引可以用于_id和作为分片键(数组对两者都无效)。

因此文档可能类似于:

{
    _id: { pid1: 'A', pid2: 'B' },
    commonField1: '',
    commonField2: '',
}

如果您想避免重复对,可以按照可预测的顺序对ID进行排序。例如,pid1可能总是两个值中较小的一个。

默认的_id索引将允许您有效地查找(pid1,pid2)或(pid1)交互,但您可能希望在{'_id.pid2': 1}上添加额外的索引。