数据库的设计是一个项目的基石,数据库的设计质量直接影响着后期代码开发的进度,因此咱们组在本项目数据库设计中考虑了不少。这学期同步进行的数据库课程上老师曾经讲过数据库的设计包括表格设计,视图,存储过程,触发器,用户(权限),索引多个方面,一个项目若是只作了表格那么它的数据库至关于只作了六分之一的任务,因此咱们组严格按照数据库设计思路对这六个部分都进行了不少的思考,这篇博文思路也主要分为这六大块。前端
一,项目简介算法
首先在讲数据库具体设计前,先简单讲解下咱们组的项目,咱们组的项目是一个研究型项目,是作一款基于RDF的搜索引擎,项目难度主要集中于算法部分:好比如何将天然语言转换为结构化查询语言SPARQL语句,如何在分布式数据库中查询处理并合并结果等等,并且搜索数据集不是创建在常规的数据库上的,因此咱们这个项目的数据库表格仅是为前端页面,权限管理等设计的;接下来简单讲解下咱们项目的需求:最开始用户能够在首页选择注册或直接登录,也能够以游客身份直接进入搜索界面开始输入搜索关键词进行搜索。同时和百度谷歌同样,用户还能够进入查询日志页面查找本身的历史记录,登陆用户还能够进入我的中心修改一些我的信息,而管理员能够浏览全部用户的历史记录(这一点主要基于优化搜索算法考虑),还能够操做修改用户权限。数据库
二,表格设计安全
1)首先咱们须要解决刚才需求中讲到的权限管理,也就是不一样类型用户拥有不一样功能,这里咱们讨论了不少最终遵从了老师的建议采用了用户组表与用户表的形式,赋权是给用户组赋权,这样相较于将不一样等级用户分表存储的思路有不少好处,这种思路使得系统有很好的可拓展性,避免了用户按组存储方式致使的用户组表格过多或新加用户类型时频繁新建表格的缺陷(假如一个系统有100中不一样用户类型,就得增长100张不一样类型的用户表。。。)数据库设计
在这里用户表添加状态与上次登录时间两个字段是基于安全考虑,由于登陆系统能够查看的我的历史记录属于比较隐私敏感的内容,因此须要判断诸如帐号短期重复登陆之类帐号异常行为分布式
2)用户被分入不一样用户组后,具体的模块是分配给用户组,由于用户组表与模块信息表直接是多对多关系,因此须要一张关系表链接优化
3)由于权限是比较敏感的信息,因此咱们组吸收了数据库老师课堂上审计的想法,专门创建了一个表格存储修改权限的每一次记录,若是系统实际运行过程当中出现异常权限改动,能够在这个审计表中来寻找攻击者的踪影。搜索引擎
4)接下来还须要解决搜索历史记录问题,由于关键词与结果表均是一对多的关系,不须要专门创建联系表。同时为了改进算法使搜索结果更精确,还会记录搜索用时和每一个结果的点击时间。spa
5)由于RDF三元组中的URI会不断打上各类属性标签,每个都如上图中这么长,中间搜索查询处理过程当中为了加快速度减小负担,因此咱们组又创建了实体结点表和属性表。同时为了描述图的结构,咱们也创建了一张表(知识图谱RDF会构建一张图来实现搜索)设计
6)总结:所有表格以下图物理模型所示,同时由于咱们设计的表格中的主键基本都是编号,ID类型,因此除了用户ID外基本均可以设置为自增
三,视图设计
1)在用户中心显示某用户搜索历史记录,我的信息时可使用视图
2)在管理员管理中心查看每一个用户的权限时可使用视图
四,存储过程设计
1)在提取某个用户我的历史查询记录时咱们可使用存储过程生成对应的视图:参数是用户名或ID
2)当我的历史记录太多时咱们提供了直接查找关键词来快速锁定历史记录,这个过程也使用了存储过程:参数是用户名/用户ID和关键词
3)当我的历史记录太多时咱们还提供了经过输入时间段来锁定历史记录,这个过程也使用了存储过程:参数是用户名/用户ID和时间段
(虽而后来得知存储过程调试很麻烦,小项目最好不要使用,但咱们组以为以前的一些讨论思考仍是颇有价值的)
五,触发器设计
触发器经常使用的地方有两处,一是用来进行业务规则约束,二能够用来审计,因此应用到咱们项目
1)用户注册提交后会复查填入手机号是否已注册,这里会有一个触发器;.....................................................................................实现业务规则约束
2)用户注册昵称(用户名)或修改昵称时也会复查是否已存在,一样须要加一个触发器;........................................................实现业务规则约束
3)用户登陆为了确保帐号安全,会检查状态与上次登陆时间帐号查看是否存在短时间重复登陆,也须要一个触发器;...........实现审计
六,权限管理设计
1)咱们这个项目不一样用户权限集中在查看内容范围不一样,因此这一块暂时不能直接用课堂的知识。
2)这个地方咱们吸收了尹庚老师的一些建议,系统访问用户表若是发现为空时,会自动添加一个root用户,并赋给root用户全部权限,防止系统被人攻击后没有一我的能够登陆系统。
七,索引设计
在提取某个用户我的历史查询记录时除了使用存储过程能够实现也能够将用户名设置为索引实现加快搜索速度,并且若是设置为惟一索引,既保证了昵称的惟一性,也减小了一个触发器