3


3

Aが100人をフォローしているとします。

それなら100のjoinステートメントが必要になるでしょう、

これはデータベースにとって恐ろしいことです。

または他の方法はありますか?

2 Answer


6


なぜあなたは100結合を必要としますか?

あなたのIDとそれに含まれる他の人のIDを含む単純なテーブル "Follows"があります。

次に、次のようなものを結合して「ツイート」を取得します。

follower.id = tweet.AuthorIDのツイート内部結合フォロワーから、上位100個のツイートを選択します。* followers.masterID = yourID

さて、あなたはまともなキャッシングを必要としていて、あなたがノンロッククエリを使うこと、そしてあなたがすべての情報を持っていることを確認する…​ (ユーザーデータをミックスに追加することもあります)

編集する

つぶやき

ID  -  tweetid AuthorID  - ポスターのID

フォロワー

MasterID  - (基本的にあなたのID)FollowerID  - (あなたをフォローしている人のID)

`フォロワー`テーブルはmasterと `followerID`に基づく複合IDを持ちますそれは2つのインデックスを持つべきです - " masterID - followerID "と" FollowerIDとMasterID "に一つ


1


真の秘訣は、データベースの使用量(キャッシュ、キャッシュ、キャッシュなど)を最小限に抑え、使用パターンを理解することです。 Twitterの特定のケースでは、キューイング、大量のインメモリキャッシング、そしていくつかの本当に賢いデータフローの最適化とは異なる手法を使用しています。 Twitterのスケーリング:Twitterの10000パーセント高速化およびその他の関連記事を読んでください。 "follow"をどのように実装するかについてのあなたの質問は、データを非正規化する(その場で結合を実行するのではなく結合テーブルを事前計算して維持する)ことです。 -11000-nails-per-second / [データベースをまったく使わない] *。 < - 必ず読んでください!