私はMongoDB + PHPをさまざまな種類のフィード(投稿、写真、投票など)とコメントとともに "facebookish"ニュースフィードに使用します。MongoDB performance:newsfeed architecture、subscribers、comments
各フィードは、いくつかの「チャネル」に属している - 現在、それはユーザ又は基かもしれない(将来的には複数の容器があってもよいです)。
すべてのユーザーは、任意のチャンネルを購読することも、そのチャンネルから購読を禁止することもできます。
ここで、数多くのチャンネルと数多くのフィードがあるとします。チャンネル/フィード/コメントに最適な構造は何ですか?
私は2つのアプローチを考えている:
1)は、各フィードで購読者のリストを収集フィード:
db.feeds.find({date_added: "this week", channel_subscribers: "my_login"});
:私は最後のフィードを取得したい場合は
feeds:
[
{date_added: ...,
last_update: ...,
title: ...,
text: ...,
channel: ...,
channel_subscribers: [...],
comments_subscribers: [...],
comments: [...]
},
{...},
{...},
{...}
]
新しいコメントでフィードを取得したい場合:
db.feeds.find({last_update: "this week", comments_subscribers: "my_login"});
長所:
- シンプルかつ高速な測定値?
短所:
- 私は/チャンネルから、私は トラフすべてのフィードやプッシュを実行する必要がため/ unsibscribeをサブスクライブしたい/ channel_subscribersのリストから自分の名前を引きます。 同じことが、チャネルコレクションに加入者のリストを保持:私は照会する必要があり
channels: [ {channel_id:..., last_update: ..., subscribers: [...]}, {channel_id:..., last_update: ..., subscribers: [...]} ]
まず私がコレクションフィード
2)個別の「チャンネル」のトンを持っている場合、それが遅くなる可能性があり最終更新チャンネル:
subscribes = db.channels.find({last_update: "today", subscribers: "my_login"})
は今私のフィードを見つける:
db.feeds.find({channel: {$in: subscribes}], date_added: "today"})
長所:
- 、シンプルで高速かつより安全なサブスクライブ/ unsubsribing。
短所:
- 私はそれが遅いので、私はで$を避ける必要があり、私はこの演算子の内側に入れて サブスクライブをたくさん持っている場合は特に感じ(?)。このケースでは、我々はさらに大きな必要があります - :
3)
users:
[
{_id: ..., login: ..., email: ..., subscribes: [...]}
]
短所(ので、各ユーザーは自分のサブスクライブのアレイを有する)のユーザーコレクションにユーザーが加入してください以前の(#2)アプローチよりも$ inの内側に配置する配列。
4)あなたの提案ですか?
MongoDBは、使用するデータ構造が最も一般的なユースケースに対応していることを推奨します。まだあなたの現在の構造を理解するのが少し難しいです。あなたはもう少しあなたの構造について詳しく説明できますか? – JohnP
私の質問を簡略化してください。より速いもの:私のサブスクリプションのリストを保持し、その大きな配列を "$ in"演算子の中に置き、それによって私のフィードを取得します。 OR - ログイン名でフィードを取得する - すべてのフィードに大きな(〜2000)のサブスクライバが含まれている場合(そのような大きな配列にマルチキーインデックスを作成するのは良い習慣ですか?) – oyatek
私は、フィード自体に加入者を残すことは悪い考えだと思います。リンクする方が良いかもしれません。これはちょっとしたSQLeyに見えますが、検索と削除も簡単に行えます。 – JohnP