0

请帮我解决这个问题

我正在尝试在 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 存储为好友 ID 来保存关系,但如果 U2 未将 U1 添加为好友,则在生成 U2 好友列表时应存储 U3 ,U4,依此类推,U2添加的user_ids

我该如何解决这个问题?我是否创建一个单独的表来保存关系

4

1 回答 1

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

尝试制定一些添加、更新和删除关系的用例场景,你会明白为什么这是标准的数据库设计实践。

于 2013-03-05T21:41:55.723 回答