首页 > 试题广场 >

设计数据库保存社区的关系

[问答题]
一个人存在于社区中,会有各种各样的身份,和不同的人相处会有不同的关系。请自行设计数据库(表结构,个数不限),保存一个人的名字,关系(包括父亲,朋友们),并尽可能的少的时间空间开销组织好每个人和其他人的关系,组织好后尝试取出一个人的关系结构。其中涉及到的SQL语句请详细写出。涉及到的数据结构,数据组织形成也请描述清楚,代码可以用伪代码或你熟悉的任何代码给出。
1. 用户信息表:储存用户基本信息
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


2. 用户关系表:储存用户关系信息
user_relation_info(user_id number(16),rel_user_id number(16),relation varchar2(32))
   user_relation_info.relation 表示用户之间的关系,用一个4位(根据系统所有需表示的关系种类而定,此处用4位便于说明)的‘01’字符串('0000')表示,'1'表示二者之间用户某种关系,'0'表示二者之间无某种关系
   如当前有4种关系:朋友、父亲、儿子、同事
   
user_id rel_user_id relation
00001 00002 0010
00002 00001 0100
00001 00003 1001

如上用户00001、00002为父子关系,00001为儿子、00002为父亲;
00001、00003为同事、朋友关系

3. 用户关系定义表:针对user_relation_info表中relation 字段中“用户关系位串”每一个位所表示的社会关系定义
   user_relation_define(relation_bit varchar2(4), relation_define varchar2(32));
relation_bit relation_define
1 同事
2 儿子
3 父亲
4 朋友

示例:查询用户00001 的社会关系
   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
在更高业务层面对 relation 进行解析,如展示层。


发表于 2015-04-23 19:44:29 回复(0)

答案:

这道题要求存储三类信息:用户信息、关系信息、用户之间的关系信息。涉及的表如下所示:

(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

朋友

编辑于 2018-07-22 09:23:53 回复(0)
关系表 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
select 姓名,关系对应者对应者姓名,关系汉字  from 关系表
where 身份ID = '5001003'
and     关系对应者ID = '5001002'
--ID 为'5001003'这个人和ID 为'5001002'这个人的关系是什么?
姓名 关系对应 对应 者姓名 关系
A3 A2 朋友
A3 A2 同事
--检索结果看出,姓名为A3这个人和A2这个人的关系既是朋友又是同事。
select 姓名,关系对应者对应者姓名,关系汉字  from 关系表
where 身份ID = '5001008'
and     关系对应者ID = '5001003'
姓名 关系对应 对应 者姓名 关系
A8 A3 儿子
A8 A3 病人
select 姓名,关系对应者对应者姓名,关系汉字  from 关系表
where 关系对应者ID = '5001008'
姓名 关系对应 对应 者姓名 关系
A1 A8
A2 A8 医生
A3 A8
A3 A8 医生
A4 A8
--姓名为A2这个人和姓名为A3这个人都是A8的医生。而且A3还是A8的父亲。
select 姓名,关系对应者对应者姓名,关系汉字  from 关系表
where 关系ID = '6007'
姓名 关系对应 对应 者姓名 关系
A8 A3 儿子
A8 A4 儿子
select 姓名,关系对应者对应者姓名,关系汉字  from 关系表
where 身份ID = '5001008'
and     关系对应者ID = '5001003'
and     关系ID = '6007'
姓名 关系对应 对应 者姓名 关系
A8 A3 儿子
编辑于 2015-04-21 14:37:34 回复(0)