0

私のWebアプリケーションは常に2次接続を照会する必要があります。各ユーザーは200人の友人を言う&これらの友人はそれぞれ200人の友人を持っています。私は、このウェブアプリケーションを速くするための正しいデータベース(およびテーブル構造)を決定するのに役立ちます。&データベースの選択:頻繁に2次接続を照会

ビジネスロジック:ユーザーが(unsigned int型ように1列に格納されている)特定のサービスを使用し、他のユーザーのリストを取得するために彼らの第一&第二度の接続を検索します。それはこのアプリの唯一の機能です。

表構造

  • ユーザー表:USER_ID(PK)、Facebook_ID(SK)、名前、特定のサービス、ロケーション
  • 関係テーブル:まだ未定。

質問:私は&「はソーシャル・ネットワーキング・データベース設計」のためにウェブを検索、多くの記事を読みました。しかし、これらのアプリケーションは私のものとはまったく異なっています。私は多くのユーザ(+ 10mil)を持っていますが、小さなデータベース&はビジネスロジックで説明されているように1つのクエリしか実行しません。

追加情報:ユーザーは自分のFacebookアカウントのみを使用して登録できます(&以降ログイン)。彼らの友人は(Facebookを介して)招待され、登録もされます。 リレーションシップテーブルは、一旦フレンド登録(アクティブ/非ブロック/未保留の友人のみ)に入力されます。したがって、私は関係表から "友情ステータス"欄を取り除くことができます。

答えて

0

2つのIDを持つテーブルが必要です。それは「友人」を定義します。この関係は対称的ですか?つまり、AがBの友人であれば、BはAの友人ですか?まあ、私は両方の行があると仮定します。

はその後

CREATE TABLE Friends (
    user1 ..., 
    user2 ..., 
    PRIMARY KEY(user1, user2), 
    INDEX(  user2, user1) 
) ENGINE=InnoDB; 

SELECT a.name, c.name 
    FROM Users AS a 
    JOIN Friends AS ab ON ab.user1 = a.user_id 
    JOIN Users AS b ON b.user_id = ab.user2 
    JOIN Friends AS bc ON bc.user1 = b.user_id 
    JOIN Users AS c ON c.user_id = bc.user2 
    WHERE a.user_id = ? 
+0

はいデザインは左右対称である&(フォロワー、ブロックされた連絡先などのような)他のオプションはありません。 私の本当の疑問は、私は2階級の友人を見つけるためにクエリを実行するとき、この設計が効率的であるかどうかです。 –

+0

すべてがキャッシュされている場合、千2度の友人は1秒未満でうまくいくはずです。完全にキャッシュされていない場合でも、わずか1秒かかる場合があります。 –

+0

使用するデータベースの経験からコメントしていただけますか?私はグラフデータベースまたはRDBMSに行くべきですか? –

関連する問題