如何在表中建立用户与其联系人之间的明确关系

时间:2013-03-05 20:36:14

标签: database oracle database-design foreign-keys primary-key

请帮我解决这个问题

我正在尝试在sql中创建一个关系表,但我面临的挑战是

如果user_table中有3个用户,u1,u2,u3

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 个答案:

答案 0 :(得分: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');

table friend是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之间的关系表。

尝试编写一些添加,更新和删除关系的用例场景,您将看到为什么这是标准的数据库设计实践。