2011-02-04 35 views
25

親愛なるデータベースの専門家/プログラマー:「フォロワー」と「フォロー」のデータベース設計ですか?

私は、このような

id  user_id   name etc. 
1  userA    
2  userB 
3  userC 
..  .. 
..  .. 

として、ユーザー情報とMySQLのテーブルを持っている私は、Twitterのような他のユーザーに何かを「従う」などの機能を作成します。 userAはuserBに従うことができ、userBはuserAに従うことができます。そのために は、私は1つのテーブルを作成する必要があり、フォロワー

id  user_id  follower_id 
1   userA  userB 
2   userC  userA 
3   userA  userC 
4   userB  userC 
5   userX  userA 

は、今私はuserAは、次の誰であるか知りたいと言うことができます。私はそうだよ: フォロワーから*を選択user_id = userA これはuserBとuserCを選択する。それだけが必要。

今私はユ​​ーザAは、ユーザAは、それから私は信者から 選択*のようなものfollower_id =ユーザAを実行する必要があります。よびUserCとuserXの次され、上記の表では、たとえば(以下されている人物、見つけたい。

マイ質問は(?心データベースの冗長性と最適化に考慮して)この問題に対する正しい、このデータベースの設計であるか、これよりも良いアプローチがあることができますか?一般的には感謝。

+0

次は** ** **間違っています –

答えて

11

、あなたのデザインが正確である、ということである。

しかし、 user_idがテーブル「users」内で一意の場合は、 "users"の列 "id"。一意の「id」の一意の「user_id」を含む1つのテーブルはかなり珍しいです。テーブル「フォロワー」の列「id」は必要ありません。

「フォロワー」の主キーは(user_id、follower_id)であり、これらの列のそれぞれに「users」の「user_id」を参照する外部キーがあることを確認する必要があります。

5

一般的なヒント。文字列ではなくIDに整数を使用します。パフォーマンスに大きな違いがあります。したがって、users.user_idを削除し、users.idの名前をusers.user_idに変更します。第2に、followersテーブルはuser_idとfollower_idのインデックスを持つ必要があります。この場合も、パフォーマンスに大きなメリットがあります。また、(user_id、follower_id)にユニークなインデックスを持ち、プライマリキーを呼び出し、IDカラムを削除するというアイディアが好きです。

+0

私は主な点として、整数がプライマリ/外部キーとして優れていることに同意します。しかし、私は彼が 'user_id'と呼んでいたものは 'ログイン名'のようなものであると考えています(そして名前を正しく変更しますが、削除する必要はありません)。システム内で一意でなければならないものです。それでも 'follow'テーブルはあなたが提案しているのと同じように、整数参照を使うべきです。 –

1

はい、あなたの設計は多対多の関係を扱う通常の方法です。 「多対多データベースのモデリング」を検索すると、この例を示す多くのリソースが見つかります。

関係表の外部キーをユーザー表に追加します。

関係に追加情報が含まれている場合は、それを接続テーブルの列として配置します。多分、たとえば、あるユーザーが別のユーザーの後を開始した日付です。

追加したID列のように、接続テーブルの別のサロゲートキーは、他のテーブルでテーブルを参照したい場合に便利です。

0

ここは私のデザインです。 followerId combiationユニークさ -

Id userId(PK) followerId  followedDate   unfollewedDate 
1  123   456   YYYY-MM-DD HH:MI:SS YYYY-MM-DD HH:MI:SS 
... ...   ...   ...     ... 

私はのuserIdをを想定しました。日付は便利です。たとえば、ユーザーがフォローを解除して5分後にもう一度操作すると、通知を生成しません。私はユーザーが誤ってそれを作ったと仮定します。そして、次の統計を日付で分析することができます。

関連する問題