2013-03-05 33 views
0

請幫我解決這個問題如何建立一個表用戶和他的聯繫人之間的獨特關係的

我想在SQL中創建關係表,但我現在面臨的挑戰是

如果有3個用戶,U1,U2,U3在USER_TABLE

create table user_tab 
(user_id varchar2(10) not null, 
user_name varchar2(20), 
user_friend_id varchar2(10), 
constraint u_pk primary key (user_id), 
constraint fk_user_snap 
foreign key (u_s_id) 
references pic_table(user_id)); 

insert into user_tab values(U1,user1) 
insert into user_tab values(U2,user2,U1) 
insert into user_tab values(U3,user3,U1) 

U1增加了U2,U3在他的好友列表,然後U2和U3將有friend_id爲U1

Select * from user_tab; 

User_id User_Name User_Friend_id 
U1   User1  
U2   User2  U1 
U3   User3  U1 

但是,如果U2將U1和U3添加爲朋友,那麼行u3中的friend_id列如何將u1和u2同時作爲外鍵?我想要實現的是,如果U1將U2添加爲朋友,則可以通過添加另一列並將U1保存爲friend_id來保存該關係,但是如果U2不添加U1作爲朋友,則當生成U2朋友列表時,它應該存儲U3 ,U4,等等,U2添加的user_ids

我該如何解決這個問題? 我是否創建一個單獨的表來保存關係

回答

1

作爲一般規則,您希望創建一個單獨的表來顯示關係。

對於問題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之間的關係表。

嘗試制定一些使用案例的添加,更新和刪除關係的情況,你會明白爲什麼這是標準的數據庫設計實踐。

+0

Jirawat,非常感謝您的幫助。關於第一個解決方案,是否有必要維護一個朋友表來識別用戶和他的聯繫人之間的關係?我問的原因是,如果一個用戶有30個朋友,那麼是否有必要有30行? Facebook或Twitter的操作原理是一樣的,一個用戶有900個聯繫人,那麼有900行?那麼如果他的朋友有1200個聯繫人,那麼是否有1200行用於存儲用戶的關係信息?從這個意義上說,Facebook的所有用戶呢?每個用戶是否存儲一個單獨的行來識別rel? – user1940212 2013-03-05 22:34:11

+0

是的,1200個聯繫人將導致1200行。如果您擔心大小,由於好友表只存儲兩個varchar2(10),所以根據字符集的不同,存儲器每行只有大約20個字節(總共24Kb)。如果你想做進一步的研究,這些類型的表稱爲聯結表。 – 2013-03-06 01:18:04

相關問題