2012-08-30 216 views
0

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

{ 
    "_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,名称和类别是常见的领域。其余的字段对于不同的类别都是不同的。我决定将所有数据存储在一个单一的收藏中,还是应该为每个类别制作不同的收藏?

+1

该选择实际上取决于您的偏好和您的应用程序用例;集合不强制执行单个文档模式。你需要搜索电影,书籍和音乐......还是他们完全独立的实体? – Stennie

+0

搜索我只会使用名称或_id。 –

+2

我的问题是您是否需要按名称搜索多个类别的匹配项,或者您是否一次只搜索一个类别(例如,只能按电影名称搜索,而不能搜索“电影和音乐”)。将这些保存在同一个集合中的一个原因是为了更容易/可能地进行跨分类搜索。 – Stennie

回答

1

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

1

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

以这种方式使用单个集合没有性能上的好处。实际上,实际上有一个好处,因为您可以稍后将该集合作为缩放策略。分割是在集合级别完成的,因此您可以根据_id字段对它们进行分片,以使它们均匀分布,或者使用分类字段为每个分片或某个组合分配特定类别。

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

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

+0

感谢您的回答。尼斯博客:) –