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