MongoDB 合并集合或有多个引用

MongoDB combine collections or have multiple references

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

因为每个类别都有不同的参数(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
  ...
}

我可以都不建议吗? :) 您可能仍在考虑如何在 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 希望您存储数据的方式。