4

ユーザーフォロワーとフォローメンバーリストを保存したい。これを行うために、USERテーブルにFOLLOWINGとFOLLOWERの2つの列を作成して、それぞれfollowingとfollowersのコンマ区切り値を格納することを考えています。

USER TABLE FIELDS:

userid
firstname
lastname
date_of_birth
following   //in this we store multiple following_id as comma separated
follower    //in this we store multiple follower_id as comma separated

もう1つの方法は、FOLLOWERとFOLLOWINGというテーブルを作成して、ユーザーのフォロワーとフォローしているメンバーIDをその中に格納することです。

USER TABLE FIELDS:

userid
firstname
lastname
date_of_birth

FOLLOWER TABLE FIELDS:

userid
follower_id (also is an user)

FOLLOWING TABLE FIELDS:

userid
following_id (also is an user)

私はデータベース設計を学んでいるので、十分な知識がありません。だから、ここで私はどちらの方法が適切であるかについて適切な考えを得ていませんか?カンマ区切りの方法を使用するのは良い考えではないことを検索しましたが、同時に、NFを使用して複数のテーブルを作成するのは良い方法ですか?JOINSを使用することの欠点はありますか?または、このシナリオに対処する他の効果的な方法はありますか?

4

2 に答える 2

4

必要なテーブルは2つusersだけです。1つは自分のを一覧表示するためのもので、もう1つは各ユーザーが誰であるかを一覧表示するためのものですfollowing

結果のテーブルは2番目の提案のようになりますfollowersが、必要なすべてのデータがすでにテーブルにあるためテーブルが不要でfollowingあり、最初の列ではなく2番目の列からキーが設定されているだけです。そのテーブルには、両方の列にインデックスが必要です。

followingテーブルには、方向ごとの関係ごとに1つの行があります。ユーザーがお互いをフォローしている場合は、テーブルに2つのエントリを配置しfollowingます。

CREATE TABLE following (
    userid ... NOT NULL,
    following_id ... NOT NULL
);

CREATE INDEX idx_user ON following(userid);
CREATE INDEX idx_following on following(following_id);
CREATE UNIQUE INDEX idx_both ON following (userid, following_id); // prevents duplicates

特定のユーザーがフォローしているIDを見つけるには:

SELECT following_id FROM following WHERE userid = ?

または、そのユーザーのフォロワーを見つけるには:

SELECT userid FROM following WHERE following_id = ?

必要に応じて適切なJOIN句を使用して、これらのクエリを拡張し、ユーザーの名前を返します。

于 2013-02-13T14:06:38.773 に答える
3

上記のどれでもない。フォロワーごとに1行。データを正規化すると、簡単に使用できます。あなたが提案しているようにそれを抽象的な混乱にしてください、そしてあなたの人生はあなたのアプリケーションが成長するにつれてますます厳しくなるでしょう。

于 2013-02-13T14:03:56.790 に答える