2012-01-10 8 views
-1

これはソーシャルネットワーキングサイトに関するものです。 Facebookを私たちのモデルにしよう。Facebookの壁紙ページのデータベースパフォーマンスを改善する

mysqlサーバにテーブルがあります:すべての投稿のプリコードを保持するための 'posts'(簡単にするためにコメントを除く)。その列は:

id、post、user_id、frnd_id_1、frnd_id_2です。

id:主キー、自動インクリメント。

ポスト:壁に書かれたポスト(それがログインしているユーザーや、彼/彼女の友人のいずれかの1つの壁も)

のuser_id:ログインしているユーザーのID(Aを想定)

friend_id_1:ログインしているユーザーの友人(Bと仮定)。このフィールドは、AがBの壁に書き込むときに使用されます。

friend_id_2:友人(Cを想定)ログインユーザ

の友人のacccordingly MySQLのテーブルに記録されたAとBの間の任意のメッセージの対応関係が存在する場合。

BがCの壁に何かを書いたとすると、Bの友人はその壁にそれを見ているとします。 Bさんに100人の友達がいるとします。上記のようにして、このテーブルにそのレコードを保存することができます。frnd_id_2は、CのIDのレコードを保持するために使用されます。

frind_2が他の「0」のレコード、isonly USER_IDとfrnd_id_1間のメッセージの対応を、持っている場合、それはfrnd_id_1がfrnd_id_2の壁に書かれたとfrind_id_1がUSER_IDの友人であることを意味します。

これまでは、すべてが顔面っぽいとまったく同じだと思います。

But -

Bに100人の友人がいるとします。その場合、BがCの壁に書き込む場合(すべてのプライバシー設定が友人の友人に対して開かれていると仮定します)。上記の方針が採用された場合、テーブルに10130レコードがあります:

1)BがCの壁(frnd_id_2 = 0)に掲示されていることを意味する1レコード(MAIN RECORDとしましょう)

2)Bの100人の友人のための別の100レコード

これは私が私の脳に持っている方法です。完全なメッセージではなく、メインレコードのIDである 'post'カラムに(または 'post'カラムを空白にして別のもの、つまりmain_record_idを作成して)保存することで、もう少し改善することができます。

しかし、事実です:単一の投稿の場合、101 dbクエリ(この場合)を実行する必要があります。 dbのパフォーマンスを向上させる他の方法はありますか?

私はスクリプト言語としてPHPを使用しています。

+0

なぜ否定的なマーキングですか?任意の説明plz? –

+0

最初は質問が間違っていました。ご心配なく。 – duffymo

+0

-ve評価を削除できませんか? –

答えて

0

または、1回のネットワークラウンドトリップですべての情報を戻す1つのデータベースクエリ。私は1つのJOINクエリにそれらをバッチします。

これらのレコードを保管しておくことはできませんが、アクセス方法を制御できます。

念頭に置くべきもう一つの考えは、返される結果セットのサイズを制御することです。あなたは本当に同時に100人の友達がすべて必要ですか?一度に10人でもできるのですか?これは、1,000レコードまたは10,000レコードが返される場合に特に重要になります。

+0

'1つのネットワーク往復ですべての情報を戻す1データベースクエリ。私は1つのJOINクエリにそれらをバッチしたいと思います。私が理解できないように説明してください。参加するテーブルは何ですか? 「あなたは一度に10人も一緒にやっています」 - 残りの90のレコードとはいつ関係がありますか? –

+0

Google for SQL JOINが最初のものです。私は、ユーザーと友人、またはユーザーと投稿の間に1対多数の関係を想定しています。残りの90レコードはどうすればいいですか?まず、あなたがそれらを返さないようにあなたの質問を書いてください。次に、レコードを11から20,21から30などのように取得できるように、ユーザーに「次の10」リンクを提供してください。 – duffymo

+0

SQL結合について知っています。すべてのユーザにとって、壁のポストは単一のテーブルに格納されます。どのテーブルに参加するのですか? 90レコードについては、一度にすべての投稿を壁ページに表示することではありません。 BがCの壁に書き込むのではなく、100本のBが持つ100のレコードをDBに挿入する必要があります。その結果、100人の友人が壁を見るときに壁を得ることができます。 100レコードのものは、壁のページにそれらを表示するnptです –

0

短い答え:facebookのような壁にMYSQLを使用しないでください。このような目的には非常に効果的です。

たとえば、MongoDBの代わりにno-sqlデータベースを使用します。さまざまな種類のオブジェクトを使ってライブニュースを配信する方がずっと便利なことに驚かれることを約束します。

また、ニュースフィード用のMongoDBとそれ以外のものについては、2つのDBを組み合わせることもできます。

関連する問題