10

ソーシャルネットワークをMongoidに移植したいと思います。友達間の結合テーブルは非常に大きいです。Mongoidがこの結合テーブルをそのまま処理する方法はありますか?モデル内で独自のソリューションをいくつか見てきましたが、効率的に見えるものはありません。これを処理する方法はありますか?それとも、これは私がMongoidを使用すべきではない場合ですか?

4

4 に答える 4

6

大規模なアプリケーションでは、多対多を避ける必要があります。たとえば Twitter が行うことは、ユーザー オブジェクト内にフォロワー ID をコンマ区切り形式 (文字列) で格納することです。MongoDB は配列をサポートしているため、MongoDB の使用はさらに優れています。

NoSQL を最もよく表すのは NoJoin という用語であることを思い出してください ;-)

于 2010-08-30T06:17:36.793 に答える
4

リレーショナルアソシエーションを使用して多対多(ポリモーフィック)アソシエーションを作成し、その関係を配列として格納できます。

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配列を取得して更新する必要があります。

于 2010-09-15T07:42:06.293 に答える
1

このメソッドは非推奨です。次のように、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
于 2011-05-13T21:25:20.503 に答える
0

多対多の関係を作成したり、MongoDB でテーブルを結合したりする必要はありません。各ユーザーは、設定、写真 (GridFS) などの他のすべてと共に、フレンド グラフ全体を実際のユーザー オブジェクトに保存します。リレーショナル代数を必要とする特別なことを行う必要がある場合は、RDBMS を使用してください。良い。高度なクエリを実行することは可能ですが、mapreduce を使用する必要があります。

于 2010-07-26T06:31:21.707 に答える