2012-04-24 4 views
0

は、次のMongoidモデルこのモデル噴霧クラスフィールドの値は?

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 

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 

を考えてみましょうどのような他の上、各モデルの利点は?

最初の方が簡潔ですか、それともurl.urlポイントに霧化して後でクエリを制御する必要がありますか?

答えて

0

最初のモデルでは、正確に1つのURLを各画像または動画に関連付けることができます。 2番目のモデルでは、多くのURLを各画像や動画に関連付けることができます。

お客様のビジネス要件に適しているのはどちらですか?イメージが多くのURLを持つことは可能ですか、それとも1つしかありませんか?

個人的には、特定の画像に厳密に多くのURLが必要な場合を除き、私は最初のモデルを使用します。 Web上の各メディアのURLは一意であることがほぼ保証されているので、データ構造を過度に正規化することは実際には必要ありません。 URLクラスのレコード数は、ビデオと画像の合計レコード数と同じくらい多くなりますので、何を保存しますか?

これは、ユニークではない値(たとえばタグなど)を持つ可能性がある他の文字列フィールドの場合、タグモデルではレコード数が大幅に減り、高度またはタグの再利用を前提としたビデオレコード。

意味がありますか?

+0

したがって、値がタグのように一意でない場合は、タグと呼ばれるクラスをタグの名前を格納する単一の文字列で保持します。 – Theta

+0

そしてそのタグの例では、has_many関係はembedded_inリレーションよりも優れているでしょう。なぜなら、今度はタグのインスタンスを1つしか持たないからです。 – Theta

+0

各タグは多くのメディアを持つことができるのでおそらくhas_and_belongs_to_manyリレーションを使用します。各メディアに多数のタグを付けることができます。 –

関連する問題