论述题 8.  一个人存在于社区中,会有各种各样的身份,和不同的人相处会有不同的关系。请自行设计数据库(表结构,个数不限),保存一个人的名字、关系(包括父亲、朋友们),并用尽可能少的时间空间开销组织好每个人和其他人的关系,组织好后尝试取出一个人的关系结构。其中涉及的SQL语句请详细写出。涉及的数据结构、数据组织形成也请描述清楚,代码可以用伪代码或你熟悉的任何代码给出。
【正确答案】这道题要求存储三类信息:用户信息、关系信息和用户之间的关系信息。涉及的表见表1~表3。
   (1)用户表:存储用户基本信息
   create table user_info(user_id int pfimary key, user_name varchar(30), user_age int);(这个主键可以使用数据库自增的方式来实现,不同的数据库定义的方法有所不同)
表1 用户表
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));
表2 用户关系定义表
relation_id relation_name
1 同事
2 父子
3 朋友
(3)用户关系信息表:存储用户关系信息 create table user_relation(user_id int, rel_user_id int,relation_id int);
表3 用户关系信息表
user_id rel_user_id relation_id
1 2 1
2 3 2
1 3 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 运算结果见表4。
表4 运算结果
user_name relation_name
Ross 同事
Jack 朋友
【答案解析】