【发布时间】:2012-11-16 07:11:43
【问题描述】:
我有一组照片。它们可以从其他一些集合(事件、新闻、帖子等)中引用(一对多)
我可以像这样创建参考:
db.photos.insert({ parent:{ collection: 'events', id: 12345 }})
db.photos.insert({ parent:{ collection: 'events', id: 54321 }})
//or just DBRef
db.photos.ensureIndex({parent:1})
或
db.photos.insert({ post_id: 12345 })
db.photos.insert({ event_id: 54321 })
db.photos.ensureIndex({post_id:1}, {sparse: true})
db.photos.ensureIndex({event_id:1}, {sparse: true})
在第一种情况下,我们有一个大的复合索引 第二个——一些较小的索引
每种方法的优缺点是什么?
【问题讨论】:
-
第一种情况是子文档索引,不是复合索引。请参阅文档here 以获得对差异的基本了解。询问每种方法的优缺点是一个过于宽泛的问题。
-
由于每张照片都可以从很多地方引用,您是否考虑过将照片 ID 存储在适当的事件集合中而不是照片集合中的事件?要了解哪个“更好”以及权衡取舍,您需要考虑如何查询此信息(因为架构和索引应根据您将使用的查询进行优化,而不是孤立的数据本身)。
-
基本上答案是:这取决于您的查询。
-
@JohnnyHK,谢谢,当然,我知道其中的区别。只是把它弄混了,因为我也在考虑两个单独的字段变体 //parent_collection 和 parent_id
-
@AsyaKamsky,是的,我考虑过这个变体,而且这就是它现在的实现方式。但我还需要显示单独的照片列表。而且我敢肯定,在显示事件时,对照片集合的一个额外查询比在显示照片时对事件的多个查询要好。