0

私は、リレーションシップやフォローなどのソーシャルネットワーク機能を実装するRailsアプリに取り組んでいます。これまでのところ、多対多のリレーションシップで問題が発生するまで、すべてが順調でした。ご存知のように、mongoには結合がないため、推奨される回避策は、関係を両方の関連ドキュメントにIDの配列として格納することです。OK、少し冗長ですが、機能するはずです。

field :followers, type: Array, default: []
field :following, type: Array, default: []


def follow!(who)
  self.followers << who.id
  who.following << self.id
  self.save
  who.save
end

これはかなりうまく機能しますが、これはトランザクションが必要になるケースの1つですが、mongoはトランザクションをサポートしていません。IDが「フォロー済み」フォロワーリストに追加されているが、「フォロワー」フォローリストには追加されていない場合はどうなりますか?つまり、最初のドキュメントが適切に変更されたが、何らかの理由で2番目のドキュメントを更新できない場合です。

多分私は悲観的すぎますが、より良い解決策はありませんか?

4

1 に答える 1

0

関係を一方向にのみ保存し、誰かがフォローしているユーザーをユーザードキュメントに「フォロー」として保存することをお勧めします。次に、ユーザーU1のすべてのフォロワーをクエリする必要がある場合は、クエリを実行できます{users.following : "U1"} 。配列にマルチキーインデックスを設定できるため、このフィールドにインデックスを付けると、このクエリは高速になります。

その方向にのみ進むもう1つの理由は、1人のユーザーが、フォローできるさまざまなユーザーの数に実際的な制限があることです。ただし、非常に人気のあるユーザーが持つ可能性のあるフォロワーの数は、システム内のユーザーの総数に近い可能性があります。それほど大きくなる可能性のある配列をドキュメントに作成することは避けたいと考えています。

于 2012-06-15T21:00:11.543 に答える