作爲一般規則,您希望創建一個單獨的表來顯示關係。
對於問題1(和Friendster)
create table user_tab
(user_id varchar2(10) not null,
user_name varchar2(20),
constraint u_pk primary key (user_id)
);
create table friend
(user_id varchar2(10) not null,
user_id_friend varchar2(10) not null,
constraint u_f_pk primary key (user_id, user_id_friend),
constraint friend_uid_fk_user_tab foreign key (user_id)
references user_tab(user_id),
constraint friend_uidf_fk_user_tab foreign key (user_id_friend)
references user_tab(user_id)
);
insert into user_tab(user_id) values ('u1');
insert into user_tab(user_id) values ('u2');
insert into user_tab(user_id) values ('u3');
insert into friend(user_id, user_id_friend)
values ('u1','u2');
insert into friend(user_id, user_id_friend)
values('u1','u3');
insert into friend(user_id, user_id_friend)
values('u2','u1');
insert into friend(user_id, user_id_friend)
values('u2','u3');
表的朋友是在user_tab兩個條目之間的關係表。
對於問題2(的flickr)
create table pic_table
(pic_id number not null,
user_id_uploader varchar2(10) not null,
pic_snap bfile,
constraint snp_pk primary key (pic_id),
constraint pic_table_uidu_fk_user_tab foreign key (user_id_uploader)
references user_tab(user_id)
);
create table pic_rating (
pic_id number not null,
user_id_rater varchar2(10) not null,
rating number,
constraint pic_rating_pk primary key(pic_id,user_id_rater),
constraint pic_rating_pid_fk_pic_table foreign key (pic_id)
references pic_table(pic_id),
constraint pic_rating_uidr_fk_user_tab foreign key (user_id_rater)
references user_tab(user_id)
);
insert into pic_table(pic_id, user_id_uploader) values
(1, 'u1');
insert into pic_rating(pic_id, user_id_rater, rating) values
(1, 'u2', 2);
insert into pic_rating(pic_id, user_id_rater, rating) values
(1, 'u3', 3);
表pic_rating是pic_table和user_tab之間的關係表。
嘗試制定一些使用案例的添加,更新和刪除關係的情況,你會明白爲什麼這是標準的數據庫設計實踐。
Jirawat,非常感謝您的幫助。關於第一個解決方案,是否有必要維護一個朋友表來識別用戶和他的聯繫人之間的關係?我問的原因是,如果一個用戶有30個朋友,那麼是否有必要有30行? Facebook或Twitter的操作原理是一樣的,一個用戶有900個聯繫人,那麼有900行?那麼如果他的朋友有1200個聯繫人,那麼是否有1200行用於存儲用戶的關係信息?從這個意義上說,Facebook的所有用戶呢?每個用戶是否存儲一個單獨的行來識別rel? – user1940212 2013-03-05 22:34:11
是的,1200個聯繫人將導致1200行。如果您擔心大小,由於好友表只存儲兩個varchar2(10),所以根據字符集的不同,存儲器每行只有大約20個字節(總共24Kb)。如果你想做進一步的研究,這些類型的表稱爲聯結表。 – 2013-03-06 01:18:04