プロが教える店舗&オフィスのセキュリティ対策術

かなり初心者です。もしかしたら妙な事を訊いているのかもしれません。

php5.4.16とmysql5.5.32でSNSのフレンドリストのような機能を作ろうと思います。
フレンド最大数は1000とします。この場合、1000個もカラムを作るのでしょうか?
それとも、会員個別にテーブルを作ってそこで管理するのでしょうか。
もしくは、テーブルは一つとし、会員番号のカラムを二つ用意、関係性を示したテーブルを作るのでしょうか?
もしくは、カラムは一個で文字列で操作したりするのでしょうか?(カンマで区切る等)

パフォーマンス的にどの設計が正しくて、どの設計が間違いなのでしょうか…
回答よろしくお願いします。

A 回答 (2件)

こんなデータの持ち方をすると集計しやすいかと



仮に長野、亀井、坂本、阿部、村田の5人がいて、
長野は亀井と友達、阿部は長野、亀井、坂本と友達、村田はぼっちだとすると

//元データ
create table user(uid int not null unique ,name varchar(20));
insert into user values(1,'長野'),(2,'亀井'),(3,'坂本'),(4,'阿部'),(5,'村田');
create table friend(id int primary key auto_increment,fid int,uid int,unique(fid,uid));
insert into friend(fid,uid) values(1,1),(1,2),(2,1),(2,4),(3,2),(3,4),(4,3),(4,4);

※friendテーブルのfidは友達二人をつなぐためのリンク用id

(1)各自友達が何人いるか集計する
select user.uid,name,coalesce(count,0) as count from user
left join(
select uid,count(*) as count from friend
group by uid
) as sub on sub.uid=user.uid
order by uid;

(2)各自の友達の名前を羅列する
select u1.uid,u1.name,friends
from user as u1
left join(
select f1.uid,group_concat(u2.name) as friends
from friend as f1
inner join friend as f2 on f1.fid=f2.fid and not f1.uid=f2.uid
inner join user as u2 on f2.uid=u2.uid
group by uid
) as sub on u1.uid=sub.uid
    • good
    • 0
この回答へのお礼

回答有り難うございます。

お礼日時:2013/07/31 13:07

通常なら「テーブルは一つとし、会員番号のカラムを二つ用意、関係性を示したテーブルを作る」だと思います。

    • good
    • 0
この回答へのお礼

回答有り難うございます。

お礼日時:2013/07/31 13:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!