【问题标题】:MongoDB combine collections or have multiple referencesMongoDB 合并集合或有多个引用
【发布时间】:2015-07-11 17:11:40
【问题描述】:

我有一组可供用户选择的类别(电影、音乐、书籍等)并对所选类别中的项目进行评分。

因为每个类别都有不同的参数(moviesyearmusicartist 等)我想将每个类别分成自己的集合,但是,这带来了必须引用的问题到评级集合中的正确文档(选项 1)。

将所有类别分开并在收视率集合中包含一堆参考资料会更聪明吗?或者将所有类别合并到一个集合中,其中每个文档的大部分参数都为空白(选项 2)?

编辑:我想另一种选择是让每个类别都有自己的收视率集合(即MovieRatings),但这会有点混乱......


选项 1:

项目:

Movies = {
  title: String,
  year: Number,
  imageUrl: String
}

Music = {
  title: String,
  artist: String,
  imageUrl: String
}

评分:

Ratings = {
  user: ObjectId,
  movie: { type: Schema.Types.ObjectId, ref: 'Movies' },
  music: { type: Schema.Types.ObjectId, ref: 'Music' },
  ...
  rating: Number
}

选项 2:

项目:

Items = {
  title: String,
  artist: String,
  year: Number,
  imageUrl: String
}

评分:

Ratings = {
  user: ObjectId,
  item: { type: Schema.Types.ObjectId, ref: 'Items' },
  rating: Number
  ...
}

【问题讨论】:

    标签: mongodb mongoose schema mongodb-query


    【解决方案1】:

    我可以不建议吗? :) 您可能仍在考虑如何在 RDBMS 中为这个问题建模,但 MongoDB 是完全不同的动物。您希望尽可能避免引用,您可以在此示例中这样做。

    在您的users 集合中,您可以有一个ratings 数组,每个rating 应描述是否对电影或音乐项目进行了评分,以及评分本身。

    这样的东西会给你更好的性能:

    {"_id": "sherlock@holmes.net", "ratings": [{ "type": "movie", "title": String, "year": Number, "imageUrl": String, "rating": Number }, { "type": "music", "title": String, "artist": String, "imageUrl": String, "rating": Number }] }

    请注意,根据您想要查询或生成此数据的方式,您可能会受益于 其他 模式。这只是一个示例,可帮助您习惯于以非规范化术语思考——MongoDB 希望您存储数据的方式。

    【讨论】:

    • 所以你的意思是让参数(标题、图片网址)在集合中重复是可以的?例如,如果我稍后要修改电影标题/图像怎么办?我也必须使用新参数更新每个用户的评分...
    • 是的,没错。重复是非规范化不可避免的一部分。在某些情况下,这很重要,但在这种情况下,也许不是——如果您修改标题/图像,那么“新”标题/图像真的与评价它的用户相同吗?不必要。可能应该让用户有机会再次对其进行评分。事实上,如果您是由社区维护的网站,那么用户就有可能拍摄一部评分很高的电影并将标题/图片更改为淫秽内容!
    猜你喜欢
    • 1970-01-01
    • 2013-02-25
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多