mongodb-架构设计

时间:2012-08-30 11:10:54

标签: mongodb schema

我使用mongodb作为我的后端。我有电影,音乐,书籍等数据,我将其存储在一个集合中。每个bson条目的必填字段是“_id”,“name”,“category”。其余字段取决于条目所属的类别。 例如,我有一个存储的电影记录,如。

{
  "_id": <some_id>,
  "name": <movie_name>,
  "category": "movie",
  "director": <director_name>,
  "actors": <list_of_actors>,
  "genre": <list_of_genre>
}

对于音乐,我有,

{
  "_id": <some_id>,
  "name": <movie_name>,
  "category": "music"
  "record_label": <label_name>
  "length": <length>
  "lyrics": <lyrics>
}

现在我有12个不同的类别,其中只有_id,name和category是常见字段。对于不同的类别,其他字段都是不同的。我决定将所有数据存储在一个单独的集合中,或者我应该为每个类别制作不同的集合。

2 个答案:

答案 0 :(得分:1)

如果您要搜索不同的类别,则最好使用单个集合。拥有单个集合可能会降低插入的性能,但如果您没有高写入需求,则无关紧要。

答案 1 :(得分:1)

MongoDB允许您将任何字段结构存储在文档中,即使每个文档都不同,因此这不是问题。通过拥有这3个一致的字段,您可以将它们用作索引的一部分并处理您的查询。这是无模式数据库帮助的一个很好的例子,因为您可以将所有内容存储在单个集合中。

以这种方式使用单个集合没有任何性能损失。实际上,实际上有一个好处,因为您可以在以后将shard集合作为缩放策略。分片在集合级别上完成,因此您可以根据_id字段进行分片以均匀分布,或者使用类别字段为每个分片创建特定类别,甚至组合。

有一点需要注意的是未来的查询要求。如果您确实需要索引其他字段,那么您可以使用sparse indexes,这意味着没有索引字段的文档将不在索引中,因此不会占用索引中的任何空格;一个方便的优化。

如果您进行了更新,还应该be aware of growing the documents。这确实会对性能产生重大影响。