| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> db系统设计 -> 正文阅读 |
|
[大数据]db系统设计 |
前言 ????????欲先设计一个系统,必先了解其组成。db系统的组成结构有且只有两种:实体、关系。因而,db系统的设计,实际上就是对实体及其之间的关系的设计。 正文 ? ? ? ? 下面,我们从一个简化的学校教务系统展开,说明db系统设计的过程。 第一步:分析实体与关系,建立数据表 ? ? ? ? 教务系统的实体有:老师、学生、课程、班级。关系有:老师-课程,课程-学生,课程-班级,班级-学生。所以一共需要建立 4(实体)+ 4(关系)=8张数据表。每个表的字段这里不作说明,因为那是属于数据库设计的范畴。 第二步:编写增删改查sql ? ? ? ? 接下来我们为每个表建立dao层,每个表的dao层只包含对该表的数据进行操作,不能有关联查询操作,每个dao中,理论上只应该包含五条sql语句,它们分别是:?
? ? ? ? 在springboot + mybatis + mybatis-generator框架下,分别对应五条sql语句:
? ? ? ? 理论上来说,这五条sql语句包含了对该表的全部操作,不应该再增加额外的sql语句,sql语句应该越少越好,原因如下: ????????1、sql容易出错。相对于代码而言,sql没有语义校验; ????????2、更容易维护。对表字段进行修改时需要修改所有的sql,sql越少维护越简单; ????????3、避免重复造轮子。多余的sql本质上是重复造轮子,因为这五条sql已经包含了对该表的全部操作,是最小逻辑完备sql集合。 ????????一个良好的dao层的代码如下图所示:
? ? ? ? 上图是"课程"数据表对应的dao层,其他7个数据表的dao层与之类似。? 第三步:编写service ? ? ? ? service设计是db系统设计的灵魂,db系统好不好扩展,容不容易维护,方不方便重用,几乎完全取决于service层的设计。因而,我们会花较大的篇幅说明如何设计service层。 ? ? ? ? 3.1 基础服务层,xxBaseService ? ? ? ? 基础服务层只包含对实体的增删改查服务,是对dao层的增删改查的扩展。前面说到,dao层只包含五条sql语句,然而在实际项目之中,这五条sql不能满足需要,如"课程"的查询,有时候我们希望按"课程学分"来查,希望在调用的时候只需要传"学分"即可,而不希望先生成一个包含"学分"的CourseQuery的对象,再进行查询,这个时候,我们就可以直接在CourseBaseService中编写该查询语句,如下:
? ? ? ? 这样,外部只需要调用CourseBaseService里面的selectByCredit()方法,而不需要调用dao层的最原始的selectSelective()方法了。 ? ? ? ? 对于每一个dao,我们都给它一个baseSerivce。这样一共8张数据表,就分别对应8个dao,8个baseService,其他服务在需要保存数据的时候,应该调用baseService里面的方法,而不应该直接引用dao层中的方法,服务应该依赖于服务,而不应该依赖于dao。、 ? ? ? ? 这样做有以下好处: ? ? ? ? 1、方便新增。当有新的查询需求时,可直接在baseService中增加,而不需要改动dao层的代码,可以最大限度地减少sql出错的可能性。 ? ? ? ? 2、方便变更。当数据表的删除查询由物理删除改为逻辑删除时,可统一修改baseService中的删除和查询,使之变成逻辑删除和逻辑查询,仍然不需要改动sql。 ? ? ? ? 一句话,方便维护。 ? ? ? ? 3.2 服务层 xxService ? ? ? ? 服务层是整个系统的核心,它依赖于其他服务,同时只提供在自己视野范围内的服务。 ????????一个服务首先依赖于它的基础服务。如CourseService首先依赖于基础服务CourseBaseService,CourseService不实现数据的增删改查,而是依赖于其baseService来实现对数据表的增删改查。 ? ? ? ? 其次依赖于它的扩展服务,如:在保存课程的时候需要同步至其他系统,则需要依赖于同步服务;需要根据每个字典值决定是否要校验某些信息,则需要依赖于字典服务;需要。。。,总而言之,当一个服务层要实现某个功能,应该尽可能去引用其他类已经实现的功能,而不应该自己一手包办。 ? ? ? ? 一个服务应该只提供自己视野范围内的服务。如课程服务可以提供课程的保存服务,判断课程是否存在的服务,但决不应该提供判断班级是否存在的服务。超出视野的服务一概不提供。 ? ? ? ? 3.3 综合服务层 ? ? ? ? 不同于基础服务层(xxBaseService)与服务层(xxService),综合服务层没有唯一对应的数据表,综合服务层可能对很多个数据表进行操作。如学生,学生这个实体除了包含学生本身的信息,如身高、年龄、体重,还包含其他的信息,如学习经历、工作经历,家庭关系等等。这么多的信息,一个数据表肯定是不行的,需要用多个数据表分别保存不同的信息。这样一来,在保存学生这个实体的时候,需要同时保存多个数据表,那么就需要调用多个数据表的xxService进行保存操作。这样的服务层,被称为综合服务层。 ? ? ? ? 综合服务层是面向用户的,用户对于db系统的操作无非是三种:1、操作实体,2、操作关系,3、操作实体&操作关系。什么意思呢?如录入课程信息,则包含操作实体,不包含操作关系;学生选课,则只包含操作关系,不包含实体;录入学生信息(包括班级信息),则同时包含操作实体(创建学生)和操作关系(关联学生和班级)。 ? ? ? ? 对于只操作实体和只操作关系的操作,我们一般直接在xxService编写对应的函数即可。而对于既操作实体又操作关系的操作,我们需要将其写在综合服务。如:
? ? ? ? 在这段代码中,StudentService作为综合服务,在调用save方法的时候同时保存了学生信息(StudentInfo)和学生班级关联信息(StudentClass),同时操作了多个表。 ? ? ? ? 综合服务通过调用其他服务来实现组合服务的效果,在许多应用场景中,我们需要的是往往是综合服务而不是单一的服务,如录入学生的信息可能有多种方式,如手工录入,扫码录入,刷卡录入等等,这时候我们只需调用综合服务的save方法即可,而不需要在三种录入方式里面分别调用单一的服务来实现。 第四步,编写controller层 ? ? ? ? controller层的作用只有两个,一个是让开发人员能够迅速理解所有的业务,一个是生成swagger文档,因而,controller层的核心是注释、注解,而代码量应该尽可能少,如下是两者的对比。 错误示范:
正确示范:
? ? ? ? 在错误示范之中,controller层里面包含了没有必要的数据转换代码及参数校验代码,这些代码完全可以放到emailService中去处理。正确的做法是用一行代码说清楚其调用的服务,其他的内容全部用来书写swagger文档相关以及一些注释信息,用于说明该接口的作用。 ------------------------------------------------ 到这里,一个db系统就设计结束了,后面有时间补充总结以及一些简化代码的小技巧,拜拜! ???????? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 11:00:35- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |