MongoDB 使用现有数据重新设计架构
MongoDB Schema Redesign with existing data
我有大约 200 000 个 Object 名称和 20 个角色和 500 个用户。
角色分类为 admin,domain1,domain2,domain3,domain4..domain 20
某些角色 (domain1,domain4) 只能访问 5 object 个名称,而其他一些角色可以访问 500-20 000 object 个名称。
管理员角色可以访问所有 object(200 万)。所以我必须在管理员角色下映射所有 object。
所以我的数据模型如下所示。,
{_id:1,
Role_name: "admin"
access_objects :{name1,name2 ..........name2000000}
},
{_id:2,
Role_name: "domain1"
access_objects :{name1,name2 ..........name5}
},
{_id:3,
Role_name: "domain3"
access_objects :{name1,name2 ..........name500}
}
..
{_id:5,
Role_name: "domain5"
access_objects :{name1,name2 ..........name5000}
}
这里是 mongodb 文档 16mb 限制问题来了。我无法在嵌入式文档中存储 200 万个 object 名称,如上所示,供管理员使用。
所以我们没有将 object 名称映射到角色,而是将角色映射到每个操作。我目前的 collection 设计如下。,
{_id:1,
object_name: "object_name1"
applicable_roles :{admin,domain1,domain2,domain3,domain4,domain5}
},
{_id:2,
object_name: "object_name2"
applicable_roles :{admin,domain1,domain5}
},
{_id:3,
object_name: "object_name3"
applicable_roles :{domain4}
}
..
{_id:2000000,
object_name: "object_name2000000"
applicable_roles :{domain4,domain1}
}
在这个模型中,我们面临着缓慢的查询 response.Some 域只能访问少数 object 的名称,但需要大量的嵌入式循环来识别 objects.Already 我们需要的索引collection
以下是一些可能有用的建议。
首先,如您所演示的,将applicable_roles
映射到object_name
,因为会有更大的数量 的对象名称比适用的角色。
// Do this:
{
_id:1,
object_name: "object_name1"
applicable_roles :{admin,domain1,domain2,domain3,domain4,domain5}
}
// Instead of:
{
_id:1,
role: "admin"
applicable_objects: {object1, ...., object200000}
}
Second,使用 array 作为元素类型来保存你的 applicable_roles
(不是具有角色名称的对象作为 属性 键)。如下所示,applicable_roles
现在位于 数组 .
中
{
_id:1,
object_name: "object_name1"
applicable_roles :[ admin,domain1,domain2,domain3,domain4,domain5 ]
}
(顺便说一下,applicable_roles
和 applicable_objects
在你的 post 中既不是对象也不是数组。打字错误?)
第三,趁着indexes。通过在 applicable_roles
数组上添加索引,您将看到性能得到提高。
db.yourcollection.createIndex({ applicable_roles : 1 })
(如果您将 applicable_roles
作为对象而不是数组,那么每一行的 applicable_roles
对象模式都会不同,因为我假设对象键是角色名称。这种格式会阻止您在 applicable_roles
字段上拥有完全有用的索引,因为该字段的对象模式在行之间不一致。)
我有大约 200 000 个 Object 名称和 20 个角色和 500 个用户。 角色分类为 admin,domain1,domain2,domain3,domain4..domain 20
某些角色 (domain1,domain4) 只能访问 5 object 个名称,而其他一些角色可以访问 500-20 000 object 个名称。 管理员角色可以访问所有 object(200 万)。所以我必须在管理员角色下映射所有 object。 所以我的数据模型如下所示。,
{_id:1,
Role_name: "admin"
access_objects :{name1,name2 ..........name2000000}
},
{_id:2,
Role_name: "domain1"
access_objects :{name1,name2 ..........name5}
},
{_id:3,
Role_name: "domain3"
access_objects :{name1,name2 ..........name500}
}
..
{_id:5,
Role_name: "domain5"
access_objects :{name1,name2 ..........name5000}
}
这里是 mongodb 文档 16mb 限制问题来了。我无法在嵌入式文档中存储 200 万个 object 名称,如上所示,供管理员使用。
所以我们没有将 object 名称映射到角色,而是将角色映射到每个操作。我目前的 collection 设计如下。,
{_id:1,
object_name: "object_name1"
applicable_roles :{admin,domain1,domain2,domain3,domain4,domain5}
},
{_id:2,
object_name: "object_name2"
applicable_roles :{admin,domain1,domain5}
},
{_id:3,
object_name: "object_name3"
applicable_roles :{domain4}
}
..
{_id:2000000,
object_name: "object_name2000000"
applicable_roles :{domain4,domain1}
}
在这个模型中,我们面临着缓慢的查询 response.Some 域只能访问少数 object 的名称,但需要大量的嵌入式循环来识别 objects.Already 我们需要的索引collection
以下是一些可能有用的建议。
首先,如您所演示的,将applicable_roles
映射到object_name
,因为会有更大的数量 的对象名称比适用的角色。
// Do this:
{
_id:1,
object_name: "object_name1"
applicable_roles :{admin,domain1,domain2,domain3,domain4,domain5}
}
// Instead of:
{
_id:1,
role: "admin"
applicable_objects: {object1, ...., object200000}
}
Second,使用 array 作为元素类型来保存你的 applicable_roles
(不是具有角色名称的对象作为 属性 键)。如下所示,applicable_roles
现在位于 数组 .
{
_id:1,
object_name: "object_name1"
applicable_roles :[ admin,domain1,domain2,domain3,domain4,domain5 ]
}
(顺便说一下,applicable_roles
和 applicable_objects
在你的 post 中既不是对象也不是数组。打字错误?)
第三,趁着indexes。通过在 applicable_roles
数组上添加索引,您将看到性能得到提高。
db.yourcollection.createIndex({ applicable_roles : 1 })
(如果您将 applicable_roles
作为对象而不是数组,那么每一行的 applicable_roles
对象模式都会不同,因为我假设对象键是角色名称。这种格式会阻止您在 applicable_roles
字段上拥有完全有用的索引,因为该字段的对象模式在行之间不一致。)