我的问题比标题更深一些。
在数据库中,将有数百万(可能是未来数十亿)对象。用户将与这些对象相关。用户将成为对象'拥有者。对象将由多个用户拥有(数千个),用户将拥有数百万个对象。
因此,我不想为每个单独的关系创建文档,因为许多用户将拥有相同的对象。
我考虑过将用户ID存储在每个对象文档的数组中,但我不确定是否会有性能损失。此外,MongoDB对每个文档都有16MB的限制,这是另一个消极性。因为每个ObjectID是12个字节并且有100万用户,所以它消耗12MB的文档。必须有一个更好的结构。
如何最大限度地减少这种关系记录?
答案 0 :(得分:0)
在我看来,你可能不得不打破你的要求。我相信数据应该以一种易于访问的方式保存。为此,必须考虑您的要求 - 您计划如何显示或使用数据?
无论如何,我确信如果我拥有1000个物体,那么立即看到所有物体是没有意义的。我希望在页面中看到的可能是每页10或每周或每天。
考虑到上述情况,让我们来看看这个场景。
假设我拥有以下文档。
Object1,Object2,Object5,Object6 ......
我将创建一个中间集合,我将存储关系,每个对象每天(或每小时 - 如果需要更细粒度的搜索)将有一条记录。
{
"_id": "someId",
"object": "Object1",
"year": 2015,
"month": 12,
"day": 1,
"hour": 12,
"owned_by": [
"stackyname",
"titogeo"
]
},
{
"_id": "someId",
"object": "Object2",
"year": 2015,
"month": 12,
"day": 1,
"hour": 12,
"owned_by": [
"antman",
"titogeo"
]
},
{
"_id": "someId",
"object": "Object2",
"year": 2015,
"month": 12,
"day": 2,
"hour": 13,
"owned_by": [
"batman",
"heman"
]
}
这意味着每小时每个对象都有一个关系文档。当我拥有一个文档时,我将我的用户id推送(upsert)到当前关系对象。当前关系对象是
find({
"object": "object6",
"year": "currentYear",
"month": "currentMonth",
"hour" : "currentHour"
});
如果我想要拥有对象的所有用户,我可以查询关系集合find({"object": "object6"})
(当然是分页)。
如果我想要我拥有的所有文件,我可以查询find({'owned_by' : 'titogeo'})
我不是架构设计方面的专家,也不了解各种技术。这些是我的一些想法,让我知道你的。