1个文档有更新vs许多较小和插入

时间:2014-02-14 08:54:59

标签: mongodb

我需要为存储他们喜欢的项目的用户开发一个数据集 - 可能有5%的用户会有收藏,平均可能有5到10个收藏,最多只有50个。几乎每个用户都会有一个“获得最爱”的呼叫发生,无论他们是否拥有它们,但可能不经常添加

我的假设是:“获得收藏”可能比“添加/发布收藏”多出100倍。

在mongo中使用这个结构会更好吗,这可能会减慢插入速度(因为它需要为每个用户更新1个文档),但检索所有文档可能会更快。

{
  _id : 123456,  (the user id)
  favourites : [
     { item_id : 43563, created_date : ... },
     { item_id : 31232, created_date : ... },
     { item_id : 23472, created_date : ... }
  ]
}

或每个收藏的1个文件

{
  _id: ...,
  user_id : 123456,
  item_id : 43563,
  created_date:...
}
{
  _id: ...,
  user_id : 123456,
  item_id : 31232,
  created_date:...
}
{
  _id: ...,
  user_id : 123456,
  item_id : 23472,
  created_date:...
}

第二种结构对于未来的需求变更可能更灵活,但我假设第一种结构将本地化磁盘上一个区域中的所有数据,并且读取速度可能更快。

然后,我不确定更改集合文档的大小(通过许多更新)是否会产生不利影响? (即低级别是否必须在磁盘上移动文档,或者它是否会对数据进行分段,因为它可能不会在第一次插入时在存储上预分配足够的空间)

问题是:推荐使用一种方法,或者比其他方法具有更高的性能。

1 个答案:

答案 0 :(得分:2)

设计Mongo集合的一种方法是考虑最有可能使用数据的方式并为此目的设计数据。在您的情况下,您的用户将更频繁地查询收藏夹添加它们。因此,应该设计集合以优化此查询。

考虑到这一点,第一个选项是两者中最优选的。但是,您可能需要考虑对该结构稍作修改。

正如您所说,将为所有用户调用getFavourites方法,但只返回5%用户的收藏列表。此调用必须检索收藏夹数组并确定它是否包含内容。虽然这不会花费太多,但您可以通过添加另一个字段来预先计算此调用,该字段仅在用户具有收藏夹时才为真。因此,只需查询此字段,然后仅在返回的值为true时查询收藏夹。

我想象一个结构如下:

{
  _id : 123456,  (the user id),
  hasFavourites: 1,
  favourites : [
     { item_id : 43563, created_date : ... },
     { item_id : 31232, created_date : ... },
     { item_id : 23472, created_date : ... }
  ]
}

此文件有收藏夹,因此字段hasFavourites为1,如果不是,则为0。