user_info (user_id number(16),user_name varhcar2(32) ,age number(4));
user_id | user_name | age |
00001 | Tom | 28 |
00002 | James | 53 |
00003 | Lily | 25 |
user_relation_info(user_id number(16),rel_user_id number(16),relation varchar2(32))
user_id | rel_user_id | relation |
00001 | 00002 | 0010 |
00002 | 00001 | 0100 |
00001 | 00003 | 1001 |
user_relation_define(relation_bit varchar2(4), relation_define varchar2(32));
relation_bit | relation_define |
1 | 同事 |
2 | 儿子 |
3 | 父亲 |
4 | 朋友 |
select b.rel_user_id,a.user_name,b.relation from user_info a,user_relation_info b where a.user_id = b.rel_user_id and b.user_id = 00001;
rel_user_id | user_name | relation |
00002 | James | 0010 |
00003 | Lily | 1001 |
答案:
这道题要求存储三类信息:用户信息、关系信息、用户之间的关系信息。涉及的表如下所示:
(1)用户表:储存用户基本信息
create table user_info(user_id int primary key, user_name varchar(30) ,user_age int);(这个主键可以使用数据库自增的方式来实现,不同的数据库定义的方法有所不同)
user_id | user_name | user_age |
1 | James | 18 |
2 | Ross | 25 |
3 | Jack | 50 |
(2)用户关系定义表:主要存储用户之间所有可能的关系
create table relation_define(relation_id int primary key, relation_name varchar2(32));
relation_id | relation_name |
1 | 同事 |
2 | 父子 |
3 | 朋友 |
(3)用户关系信息表:储存用户关系信息
1. create table user_relation(user_id int, rel_user_id int,relation_id int );
user_id | rel_user_id | relation_id |
1 | 2 | 1 |
2 | 3 | 2 |
1 | 3 | 3 |
上表中数据表示1(James)和2(Ross)是同事关系。3(Jack)和2(Ross)是父子关系。1(James)和3(Jack)是朋友关系。
示例:查询用户1 的社会关系
select a.user_name,b.relation_name from user_info a, relation_define b,
(select user_id,relation_id from user_relation where rel_user_id =1 union select rel_user_id as user_id,relation_id from user_relation where user_id =1) c
where a.user_id=c.user_id and b.relation_id=c.relation_id
运算结果见下表:
user_name | relation_name |
Ross | 同事 |
Jack | 朋友 |
关系表 | key | key | key | ||||||
身份ID | 姓名 | 出生年月 | 性别 | 关系ID | 关系汉 字 | 关系对应 者ID | 关系对应 者 对应 者姓名 | ||
5001001 | A1 | 19880101 | 1 | 6001 | 老师 | 5001008 | A8 | ||
5001002 | A2 | 19880102 | 1 | 6003 | 医生 | 5001008 | A8 | ||
5001002 | A2 | 19880102 | 1 | 6009 | 朋友 | 5001003 | A3 | ||
5001002 | A2 | 19880102 | 1 | 6010 | 同事 | 5001003 | A3 | ||
5001003 | A3 | 19880103 | 1 | 6005 | 父亲 | 5001008 | A8 | ||
5001003 | A3 | 19880103 | 1 | 6003 | 医生 | 5001008 | A8 | ||
5001003 | A3 | 19880103 | 1 | 6009 | 朋友 | 5001002 | A2 | ||
5001003 | A3 | 19880103 | 1 | 6010 | 同事 | 5001002 | A2 | ||
5001004 | A4 | 19880104 | 2 | 6006 | 母亲 | 5001008 | A8 | ||
5001008 | A8 | 19880108 | 1 | 6002 | 学生 | 5001001 | A1 | ||
5001008 | A8 | 19880108 | 1 | 6004 | 病人 | 5001002 | A2 | ||
5001008 | A8 | 19880108 | 1 | 6007 | 儿子 | 5001003 | A3 | ||
5001008 | A8 | 19880108 | 1 | 6004 | 病人 | 5001003 | A3 | ||
5001008 | A8 | 19880108 | 1 | 6007 | 儿子 | 5001004 | A4 |
姓名 | 关系对应 者 对应 者姓名 | 关系汉 字 |
A3 | A2 | 朋友 |
A3 | A2 | 同事 |
姓名 | 关系对应 者 对应 者姓名 | 关系汉 字 |
A8 | A3 | 儿子 |
A8 | A3 | 病人 |
姓名 | 关系对应 者 对应 者姓名 | 关系汉 字 |
A1 | A8 | 老师 |
A2 | A8 | 医生 |
A3 | A8 | 父亲 |
A3 | A8 | 医生 |
A4 | A8 | 母亲 |
姓名 | 关系对应 者 对应 者姓名 | 关系汉 字 |
A8 | A3 | 儿子 |
A8 | A4 | 儿子 |
姓名 | 关系对应 者 对应 者姓名 | 关系汉 字 |
A8 | A3 | 儿子 |