团队项目——数据库设计心得
一、项目简介
该系统旨在设计一款基于联邦型RDF数据库的能充分理解用户输入关键词语义的关键词检索引擎,通过构建索引以支持在线阶段的关键词检索,理解用户语义,让用户能自由表达自己的查询需求,提供精准符合要求的答案,以精简友好的界面、方便的操作为用户提供一种信息搜索的快速定位的功能,特别是为局域网用户提供更有针对性的、更方便的资源,从而提高资源的共享目标,让用户可以高效,快捷的获得想要的信息,区别于普通搜索引擎,效果更加友好,方便快捷。
二、系统的功能描述
要想设计好数据库,首先,我们应明确项目的需求,明确功能需求。
上图为根据需求画出的大致流程图。
三、确定实体
通过对搜索引擎各方面的分析,我们可以知道搜索引擎中的实体包括:用户,用户组,模块,关键词,结果。各实体包含的数据项分别如下:
(1)用户:用户id、用户名、密码、手机号、状态、加入时间、上次登录 时间、上次登录地点、用户组。
(2)用户组:用户组id、用户组名称。
(3)模块:模块id、模块名称。
(4)关键词:关键词id、用户id、关键词、搜索时间。
(5)结果:结果id、关键词id、结果url、是否点击、点击时间。
另外,为了后期算法方便,我们还将我们用到的数据集中的uri进行了编号,因为uri太长,如果不用编号的话,可能会很费时。
四、确定联系
通过以上分析,我们作如下规定:
(1)一个用户可以属于一个用户组,一个用户组可以包含多个用户;
(2)一个用户组可以绑定多个模块,一个模块可以被多个用户组绑定;
(3)一个关键词可以搜索到多个结果,一个结果对应一个关键词;
(4)一个用户可以输入多个关键词,一个关键词对应一个用户;
实体之间的联系有:
(1)用户与用户组之间(M:1)
(2)用户组与模块之间(M:N)
(3)关键词与结果之间(1:M)
(4)用户与关键词之间(1:M)
五、最终设计结果
(1) 关键词表(key_info表)
属性名 |
数据类型 |
是否为空 |
含义 |
是否为主键 |
Key_id |
int |
not null |
关键词id |
primary key |
User_id |
int |
not null |
用户id |
Foreign key |
Keyword |
varchar(100) |
not null |
用户输入的关键词 |
|
Search_t |
Datetime |
Not null |
搜索时间 |
|
(2)图结构表(schema_dir表)
属性名 |
数据类型 |
是否为空 |
含义 |
是否为主键 |
Start |
Int |
not null |
起点 |
primary key |
End |
Int |
not null |
终点 |
Primary key |
Path |
Int |
not null |
路径条数 |
|
(3)属性表(pre_info表)
属性名 |
数据类型 |
是否为空 |
含义 |
是否为主键 |
pre_id |
Int |
not null |
属性编号 |
primary key |
pre_uri |
varchar(20) |
not null |
属性uri |
|
(4)权限表(power_info表)
属性名 |
数据类型 |
是否为空 |
含义 |
是否为主键 |
User_id |
char(6) |
not null |
用户编号 |
primary key |
privilege |
char(15) |
not null |
权限名 |
primary key |
modifier |
Varchar(5) |
Not null |
修改人 |
|
modi_time |
datetime |
Not null |
修改时间 |
primary key |
(5)模块信息表(module_info表)
属性名 |
数据类型 |
是否为空 |
含义 |
是否为主键 |
module_id |
Int |
not null |
模块编号 |
primary key |
Module_name |
varchar(20) |
not null |
模块名 |
|
(6)用户组与模块关系表(group_module_r表)
属性名 |
数据类型 |
是否为空 |
含义 |
是否为主键 |
rela_id |
int |
not null |
关系编号 |
primary key |
group_id |
int |
not null |
用户组id |
foreign key |
module_id |
int |
not null |
模块id |
foreign key |
(7)用户组表(group_info表)
属性名 |
数据类型 |
是否为空 |
含义 |
是否为主键 |
group_id |
int |
not null |
用户组id |
primary key |
group_name |
varchar(10) |
not null |
用户组名称 |
|
(8)用户表(usr_info表)
属性名 |
数据类型 |
是否为空 |
含义 |
是否为主键 |
user_id |
varchar(5) |
not null |
用户id编号 |
primary key |
user_name |
varchar(20) |
not null |
用户账号 |
|
password |
varchar(20) |
not null |
密码 |
|
phone |
varchar(11) |
|
电话号码 |
|
state |
bool |
not null |
登陆状态 |
|
last_login_t |
datetime |
not null |
上次登陆时间 |
|
last_login_loc |
varchar(20) |
not null |
上次登陆地点 |
|
signup_t |
date |
not null |
注册时间 |
|
group_id |
int |
|
用户组id |
foreign key |
(9)结果表(result_info表)
属性名 |
数据类型 |
是否为空 |
含义 |
是否为主键 |
res_id |
int |
not null |
结果id |
primary key |
keyword_id |
int |
not null |
关键词id |
foreign key |
res_url |
varchar(300) |
not null |
搜索结果url |
|
clickon |
bool |
not null |
是否被点击 |
|
clicktime |
datetime |
not null |
点击时间 |
|
(10)结点表(class_info表)
属性名 |
数据类型 |
是否为空 |
含义 |
是否为主键 |
node_id |
int |
not null |
结点编号 |
primary key |
node_url |
varchar(255) |
not null |
结点url |
|
out_deg |
int |
not null |
结点出度 |
|
in_deg |
int |
not null |
结点入读 |
|
node_rank |
int |
not null |
结点排序 |
|
六、心得
这次的数据库设计,小组同学内部积极讨论,积极提出意见,改进数据库。在数据库设计中,我们要考虑全面,先设计概念模型,然后生成物理模型。
在设计过程中要注意:
若两个实体之间存在多对多的关系,则应消除这种关系。消除的办法是,在两者之间增加第三个实体。这样,原来一个多对多的关系,现在变为两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中去。这里的第三个实体,实质上是一个较复杂的关系,它对应一张基本表。一般来讲,数据库设计工具不能识别多对多的关系,但能处理多对多的关系。