ソーシャルネットワークをMongoidに移植したいと思います。友達間の結合テーブルは非常に大きいです。Mongoidがこの結合テーブルをそのまま処理する方法はありますか?モデル内で独自のソリューションをいくつか見てきましたが、効率的に見えるものはありません。これを処理する方法はありますか?それとも、これは私がMongoidを使用すべきではない場合ですか?
4 に答える
大規模なアプリケーションでは、多対多を避ける必要があります。たとえば Twitter が行うことは、ユーザー オブジェクト内にフォロワー ID をコンマ区切り形式 (文字列) で格納することです。MongoDB は配列をサポートしているため、MongoDB の使用はさらに優れています。
NoSQL を最もよく表すのは NoJoin という用語であることを思い出してください ;-)
リレーショナルアソシエーションを使用して多対多(ポリモーフィック)アソシエーションを作成し、その関係を配列として格納できます。
class Person
include Mongoid::Document
field :name
references_many :preferences, :stored_as => :array, :inverse_of => :people
end
class Preference
include Mongoid::Document
field :name
references_many :people, :stored_as => :array, :inverse_of => :preferences
end
ps1 = Person.create(:name => 'John Doe')
pf1 = Preference.create(:name => 'Preference A')
pf2 = Preference.create(:name => 'Preference B')
ps1.preferences << pf1
ps1.preferences << pf2
ps1.save
pf1.people.each {|ps| puts ps.name }
ps1.preferences.each {|pf| puts pf.name }
リレーショナルアソシエーションの詳細については、Mongoidのドキュメントを参照してください:http://mongoid.org/docs/associations/
注:配列として保存されたreferences_manyは、多くの関係を持つオブジェクトの大量作成/更新で驚異的に遅くなる可能性があります。従来のRDBMSは、リレーションごとに新しい行を追加するため、Mongoよりも簡単にパフォーマンスが向上します。mongoは、オブジェクト自体とリレーションごとにobject_ids配列を取得して更新する必要があります。
このメソッドは非推奨です。次のように、references_and_referenced_in_many を使用できるようになりました。
class Person
include Mongoid::Document
field :name
references_and referenced_in_many :preferences
end
class Preference
include Mongoid::Document
field :name
references_and referenced_in_many :people
end
多対多の関係を作成したり、MongoDB でテーブルを結合したりする必要はありません。各ユーザーは、設定、写真 (GridFS) などの他のすべてと共に、フレンド グラフ全体を実際のユーザー オブジェクトに保存します。リレーショナル代数を必要とする特別なことを行う必要がある場合は、RDBMS を使用してください。良い。高度なクエリを実行することは可能ですが、mapreduce を使用する必要があります。