0

この問題を解決するのを手伝ってください

SQLで関係テーブルを作成しようとしていますが、直面している課題は

user_table に u1、u2、u3 の 3 人のユーザーがいる場合

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 は友人 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

この問題に対処するにはどうすればよいですか? リレーションシップを保持するために別のテーブルを作成する必要がありますか?

4

1 に答える 1

1

原則として、関係を示す別のテーブルを作成します。

第1号(フレンドスター)の場合

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');

テーブル friend は、user_tab の 2 つのエントリ間の関係テーブルです。

第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 に答える