如何避免MongoDB中重复的条目?

时间:2016-04-28 12:24:36

标签: mongodb database-design

我的问题比标题更深一些。

在数据库中,将有数百万(可能是未来数十亿)对象。用户将与这些对象相关。用户将成为对象'拥有者。对象将由多个用户拥有(数千个),用户将拥有数百万个对象。

因此,我不想为每个单独的关系创建文档,因为许多用户将拥有相同的对象。

我考虑过将用户ID存储在每个对象文档的数组中,但我不确定是否会有性能损失。此外,MongoDB对每个文档都有16MB的限制,这是另一个消极性。因为每个ObjectID是12个字节并且有100万用户,所以它消耗12MB的文档。必须有一个更好的结构。

如何最大限度地减少这种关系记录?

1 个答案:

答案 0 :(得分:0)

在我看来,你可能不得不打破你的要求。我相信数据应该以一种易于访问的方式保存。为此,必须考虑您的要求 - 您计划如何显示或使用数据?

无论如何,我确信如果我拥有1000个物体,那么立即看到所有物体是没有意义的。我希望在页面中看到的可能是每页10或每周或每天。

考虑到上述情况,让我们来看看这个场景。

  • 我拥有很多文件。
  • 上周我拥有2,昨天5,今天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'})

我不是架构设计方面的专家,也不了解各种技术。这些是我的一些想法,让我知道你的。