IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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语句:

  • selectByPrimaryKey
  • selectSelective
  • deleteByPrimaryKey
  • updateByPrimaryKeySelective
  • insertSelective

? ? ? ? 理论上来说,这五条sql语句包含了对该表的全部操作,不应该再增加额外的sql语句,sql语句应该越少越好,原因如下:

????????1、sql容易出错。相对于代码而言,sql没有语义校验;

????????2、更容易维护。对表字段进行修改时需要修改所有的sql,sql越少维护越简单;

????????3、避免重复造轮子。多余的sql本质上是重复造轮子,因为这五条sql已经包含了对该表的全部操作,是最小逻辑完备sql集合。

????????一个良好的dao层的代码如下图所示:

@Repository
public interface CourseDao {

    int insertSelective(Course course);

    int deleteByPrimaryKey(String courseId);

    int updateByPrimaryKeySelective(Course course);

    Course selectByPrimaryKey(String courseId);

    List<Course> selectSelective(CourseQuery query);
}

? ? ? ? 上图是"课程"数据表对应的dao层,其他7个数据表的dao层与之类似。?

第三步:编写service

? ? ? ? service设计是db系统设计的灵魂,db系统好不好扩展,容不容易维护,方不方便重用,几乎完全取决于service层的设计。因而,我们会花较大的篇幅说明如何设计service层。

? ? ? ? 3.1 基础服务层,xxBaseService

? ? ? ? 基础服务层只包含对实体的增删改查服务,是对dao层的增删改查的扩展。前面说到,dao层只包含五条sql语句,然而在实际项目之中,这五条sql不能满足需要,如"课程"的查询,有时候我们希望按"课程学分"来查,希望在调用的时候只需要传"学分"即可,而不希望先生成一个包含"学分"的CourseQuery的对象,再进行查询,这个时候,我们就可以直接在CourseBaseService中编写该查询语句,如下:

@Service
public class CourseBaseService{
    @Autowired
    private CourseDao courseDao;

    public List<Course> selectByCredit(Integer credit){
        return courseDao.selectSelective(CourseQuery.builder().credit(credit).build());
    }
}

? ? ? ? 这样,外部只需要调用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编写对应的函数即可。而对于既操作实体又操作关系的操作,我们需要将其写在综合服务。如:

@Service
public class StudentService {
    @Autowired
    StudentInfoService studentInfoService;
    @Autowired
    StudentClassService studentClassService;

    public void save(SaveStudentRequest request) {
        studentInfoService.save(request.covertToStudentInfo());
        studentClassService.save(StudentClass.buildBy(request.getClassId(), request.covertToStudentInfo()));
    }

}

? ? ? ? 在这段代码中,StudentService作为综合服务,在调用save方法的时候同时保存了学生信息(StudentInfo)和学生班级关联信息(StudentClass),同时操作了多个表。

? ? ? ? 综合服务通过调用其他服务来实现组合服务的效果,在许多应用场景中,我们需要的是往往是综合服务而不是单一的服务,如录入学生的信息可能有多种方式,如手工录入,扫码录入,刷卡录入等等,这时候我们只需调用综合服务的save方法即可,而不需要在三种录入方式里面分别调用单一的服务来实现。

第四步,编写controller层

? ? ? ? controller层的作用只有两个,一个是让开发人员能够迅速理解所有的业务,一个是生成swagger文档,因而,controller层的核心是注释、注解,而代码量应该尽可能少,如下是两者的对比。

错误示范:

    @PostMapping("/addEntEmailAccount")
    @ApiOperation("开通企业邮箱用户")
    public BaseResponse addEntEmailAccount(@RequestBody BaseRequest<AddEntEmailAccountRequest> baseRequest) {
        BaseHead baseHead = baseRequest.getHead();
        AddEntEmailAccountRequest request = baseRequest.getBody();
        if (StringUtils.isEmpty(request.getAccountPrefix())) {
            throw new BaseException(ResponseEnum.ICEM000);
        }
        return BaseResponse.build(emailService.addEntEmailAccount(request, baseHead));
    }

正确示范:

    @PostMapping("/addEntEmailAccount")
    @ApiOperation("开通企业邮箱用户")
    public BaseResponse addEntEmailAccount(@RequestBody BaseRequest<AddEntEmailAccountRequest> baseRequest) {
        return BaseResponse.build(emailService.addEntEmailAccount(baseRequest.getHead(), baseRequest.getBody()));
    }

? ? ? ? 在错误示范之中,controller层里面包含了没有必要的数据转换代码及参数校验代码,这些代码完全可以放到emailService中去处理。正确的做法是用一行代码说清楚其调用的服务,其他的内容全部用来书写swagger文档相关以及一些注释信息,用于说明该接口的作用。

------------------------------------------------

到这里,一个db系统就设计结束了,后面有时间补充总结以及一些简化代码的小技巧,拜拜!

????????

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:30:42  更:2021-12-04 13:32:41 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码