0

考虑以下 Mongoid 模型

class Doc
  include Mongoid::Document
  field :name, type: String
  embeds_many :images
  embeds_many :videos
end

class Image
  include Mongoid::Document
  field :url, type: String
  field :caption, type: String
  embedded_in :Doc
end

class Video
  include Mongoid::Document
  field :url, type: String
  field :caption, type: String
  embedded_in :Doc
end

与此模型相比

class Doc
  include Mongoid::Document
  field :name, type: String
  embeds_many :images
  embeds_many :videos
end

class Image
  include Mongoid::Document
  embeds_many :urls
  embeds_many :captions
  embedded_in :Doc
end

class Video
  include Mongoid::Document
  embeds_many :urls
  embeds_many :captions
  embedded_in :Doc
end

class Url
  include Mongoid::Document
  embedded_in :image
  embedded_in :video
  field :url, type: String
end

class Caption
  include Mongoid::Document
  embedded_in :image
  embedded_in :video
  field :caption, type: String
end

每个模型比另一个模型有什么好处?

为了简洁起见,我应该选择第一个,还是应该将其原子化到 url.url 点,以便以后对查询有更多控制权?

4

1 回答 1

0

第一个模型允许您将一个 URL 与每个图像或视频准确关联。第二种模型允许您将许多 URL 与每个图像或视频相关联。

哪个更适合您的业务需求?一张图片是否有可能有多个 URL,还是只有一个?

就个人而言,除非您严格需要给定图像的许多 URL,否则我会使用第一个模型。由于几乎可以保证网络上每条媒体的 URL 都是唯一的,因此过度规范化数据结构确实没有意义。您将在 URL 类中拥有与 Video 和 Image 记录的总和一样多的记录,那么您将保存什么?

如果它是其他可能具有非唯一值的字符串字段(例如,标签),那么将其拆分是很有意义的,因为标签模型中的记录将大大少于图像和视频记录,假设高度或标签重用。

有道理?

于 2012-04-24T19:47:17.140 回答