[完结11章]技术大牛成长课,从0到1带你手写一个数据库系统分享学习

荀勗
• 阅读 101

[完结11章]技术大牛成长课,从0到1带你手写一个数据库系统分享学习

大家好,今天我将给大家分享关于如何开发一个数据库系统的知识,将从0到1手把手带着一步步去开发这个项目,希望我的分享对大家的学习和工作有所帮助,如果有不足的地方还请大家多多指正。

一、什么是数据库系统 数据库系统一般由数据库、数据库管理系统(及其开发工具)、应用系统、数据库管理员构成

二、数据库管理系统的主要功能包括 数据定义功能:DBMS提供数据定义语言(Data Definition Language,DDL),用户通过它可以方便地对数据库中的对象进行定义 数据组织、存储和管理:DBMS要分类组织、存储和管理各种数据,包括数据字典、用户数据、数据的存取路径等。 数据操纵功能:DBMS提-供数据操纵语言(Data Manipulation Language,DML),用户可以使用DML操纵数据,实现对数据库的基本操作,如查询、插入、删除和修改等 数据库的事务管理和运行管理:数据库在建立、运用和维护时由数据管理系统统一管理、统一控制,以保证数据的安全性、完整性、多用户对数据的并发使用以及发生故障后的系统恢复 数据库建立和维护功能:数据库初始数据的输入、转换功能,数据库的转储、恢复功能,数据库的重组织功能和性能监视、分析功能等。

三、数据库系统结构 1.1模式(概念模式或逻辑模式) 定义:数据库中全体数据的逻辑结构特征的描述,是所有用户的公用数据库结构。

特性:

一个数据库只有一个模式 模式与应用程序无关,只是数据的一个框架 1.2子模式(外模式或用户模式) 定义:数据库用户所见和使用的局部数据的逻辑结构和特征的描述,是用户所用的数据库结构

特性:

子模式是模式的子集 一个数据库有多个子模式,每个用户至少使用一个子模式 同一个用户可以使用不同的子模式,每个子模式可为不同的用户所用 1.3内模式(存储模式) 定义:是数据物理结构和存储方法的描述。它是整个数据库的最低层结构的表示。

特性:

一个数据库只有一个内模式,内模式对用户透明 一个数据库由多种文件组成,如用户数据文件,索引文件及系统文件 内模式设计直接影响数据库的性能

以下是开发流程: 在idea中构建如下几个子模块工程: @PostMapping("/doLogin") @ApiOperation(value = "一键注册登录接口", notes = "一键注册登录接口", httpMethod = "POST") public GraceJSONResult doLogin(HttpServletRequest request, HttpServletResponse response, @RequestBody @Valid RegisterLoginBO registerLoginBO, BindingResult result); 验证的字段上方可以写一些相关的注解,系统识别后会自动检查 RegisterLoginBO.java public class RegisterLoginBO {

@NotBlank(message = "手机号不能为空")
private String mobile;
@NotBlank(message = "短信验证码不能为空")
private String smsCode;

public String getMobile() {
    return mobile;
}

public void setMobile(String mobile) {
    this.mobile = mobile;
}

public String getSmsCode() {
    return smsCode;
}

public void setSmsCode(String smsCode) {
    this.smsCode = smsCode;
}

@Override
public String toString() {
    return "RegisterLoginBO{" +
            "mobile='" + mobile + '\'' +
            ", smsCode='" + smsCode + '\'' +
            '}';
}

}

如果校验有问题,那么可以直接获得并且放回给前端即可。 BaseController.java /**

  • 验证beanBO中的字段错误信息
  • @param result
  • @return
  • / public Map<String, String> getErrors(BindingResult result) { Map<String, String> map = new HashMap<>(); List errorList = result.getFieldErrors(); for (FieldError error : errorList) {
      // 发生验证错误所对应的某一个属性
      String errorField = error.getField();
      // 验证错误的信息
      String errorMsg = error.getDefaultMessage();
      map.put(errorField, errorMsg);
    } return map; } 一般来说,admin系统不会有主动注册功能,账号都是分配的,那么默认就会存在一个基本账户,这也是预先通过代码生成用户名和密码的。直接手动生成即可: org.springframework.cloud spring-cloud-starter-openfeign

同理,查询操作也是类似JPA的操作,再继承Repository后直接使用其内置api即可: FriendLinkMngControllerApi.java @PostMapping("getFriendLinkList") @ApiOperation(value = "查询友情链接列表", notes = "查询友情链接列表", httpMethod = "POST") public GraceJSONResult getFriendLinkList(); 首先可以在数据库通过写sql脚本实现查询 SELECT c.id as commentId, c.father_id as fatherId, c.article_id as articleId, c.comment_user_id as commentUserId, c.comment_user_nickname as commentUserNickname, c.content as content, c.create_time as createTime, f.comment_user_nickname as quoteUserNickname, f.content as quoteContent FROM comments c LEFT JOIN comments f on c.father_id = f.id WHERE c.article_id = '2006117B57WRZGHH' order by c.create_time desc 目前我们所搭建的eureka是单机单实例的注册中心,如果挂了,那么整个微服务体系完全不可以,这是不应该的,所以为了实现eureka的高可用,我们可以搭建集群。 在进行集群构建之前,大家先参照目前的eureka再去构建一个一模一样的工程,可以取名为 springcloud-eureka-cluster。 为集群中各个eureka节点配置host eureka: instance: hostname: eureka-cluster-${port:7001} # 集群中每个eureka的名字都要唯一

自定义eureka集群中另外的两个端口号

other-node-port2: ${p2:7002} other-node-port3: ${p3:7003} client:

register-with-eureka: false

fetch-registry: false

service-url:
  # 集群中的每个eureka单实例,都需要相互注册到其他的节点,在此填入集群中其他eureka的地址进行相互注册
  defaultZone: http://eureka-cluster-${eureka.other-node-port2}:${eureka.other-node-port2}/eureka/,http://eureka-cluster-${eureka.other-node-port3}:${eureka.other-node-port3}/eureka/

我们自己测试的时候时间可以设置为10秒内有10次,我认定非法请求,直接限制这个ip访问15秒,15秒后释放。(像有的网站会出现二维码让你扫描通过,或者手机验证码或者人机交互判断你当前是否是人还是机器,因为有可能是爬虫请求) 开发步骤: 首先在yml中设置基本参数: @Override public Object run() throws ZuulException { System.out.println("执行【IP黑名单】Zuul过滤器...");

// 获得上下文对象requestContext
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();

// 获得ip
String ip = IPUtil.getRequestIp(request);

/**
 * 需求:
 * 判断ip在10秒内请求的次数是否超过10次,
 * 如果超过,则限制访问15秒,15秒过后再放行
 */
final String ipRedisKey = "zuul-ip:" + ip;
final String ipRedisLimitKey = "zuul-ip-limit:" + ip;

// 获得剩余的限制时间
long limitLeftTime = redis.ttl(ipRedisLimitKey);
// 如果剩余时间还存在,说明这个ip不能访问,继续等待
if (limitLeftTime > 0) {
    stopRequest(requestContext);
    return null;
}

// 在redis中累加ip的请求访问次数
long requestCounts = redis.increment(ipRedisKey, 1);

// 从0开始计算请求次数,初期访问为1,则设置过期时间,也就是连续请求的间隔时间
if (requestCounts == 1) {
    redis.expire(ipRedisKey, timeInterval);
}

// 如果还能取得到请求次数,说明用户连续请求的次数落在10秒内
// 一旦请求次数超过了连续访问的次数,则需要限制这个ip了
if (requestCounts > continueCounts) {
    // 限制ip访问一段时间
    redis.set(ipRedisLimitKey, ipRedisLimitKey, limitTimes);

    stopRequest(requestContext);
}

return null;

}

private void stopRequest(RequestContext requestContext){ // 停止继续向下路由,禁止请求通信 requestContext.setSendZuulResponse(false); requestContext.setResponseStatusCode(200); String result = JsonUtils.objectToJson( GraceJSONResult.errorCustom( ResponseStatusEnum.SYSTEM_ERROR_BLACK_IP)); requestContext.setResponseBody(result); requestContext.getResponse().setCharacterEncoding("utf-8"); requestContext.getResponse().setContentType(MediaType.APPLICATION_JSON_VALUE); } 上面这些都是通过不同key要执行多次才能得到结果,一般来说我们会使用es的aggs功能做聚合统计,会更好。 通过一个脚本来统计男女数量: POST http://192.168.1.203:9200/fans/_doc/_search { "size": 0, "query":{ "match":{ "writerId":"201116760SMSZT2W" } }, "aggs": { "counts": { "terms": { "field": "sex" } } } }

以下就是数据库系统开发的整个流程讲解,感谢大家的阅读

点赞
收藏
评论区
推荐文章
wanQQ wanQQ
2年前
数据库系统概念 学习笔记 Day01
数据库系统概念学习笔记Day01本笔记记录粗略学习数据库系统概论的笔记数据库管理系统概念数据库管理系统DataBaseManagementsystem,DBMS是由一个互相关联的数据的集合和一组用于访问这些数据的程序数据库应该具有的功能信息存储结构的定义信息操作机制的提供提供所存储信息的安全性保证即使系统崩溃或有人企图越权访问时也可以
Wesley13 Wesley13
2年前
Mysql(14):数据库基础
2018/1/3一、数据库系统数据库系统(DatabaseSystem,DBS),是由数据库及其管理软件组成的系统。    数据库系统是为适应数据处理的需要而发展起来的一种较为理想的数据处理系统,也是一个为实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介质、处理对象和管理系统的集合体。!(http
笑面虎 笑面虎
3个月前
【完结17章】JVM七大核心系统精讲 从基础理论到高级应用
【完结17章】JVM七大核心系统精讲从基础理论到高级应用今天给大家讲解一下关于JVM的知识内容,希望对大家在学习JVM的过程中遇到的问题有所帮助,以下是参考资料下载:JVM运行机制概述类加载机制:类加载过程由类加载器来完成,即由ClassLoader及其子
赵颜 赵颜
3个月前
[完结11章]技术大牛成长课,从0到1带你手写一个数据库系统
学习地址1:https://pan.baidu.com/s/1OWDu5fNqBXRUbLGrxzpJw提取码:tjty学习地址2:https://share.weiyun.com/Tp6ewDIJ密码:6crcwd今天跟大家交流一下关于开发一款数据库系统
吉太 吉太
3个月前
技术大牛成长课,从0到1带你手写一个数据库系统(完结11章)
关于数据库系统的开发一直以来都是一个难点,它的流程复杂,涉及到的技术点众多,特别在部署这块尤为重要,今天就带着大家手把手去实现这样一个数据库系统项目。我将从理论结合实际场景综合性落地,让大家轻松吃透核心技术底层原理。首先是应用场景这块:复用到日常开发场景中
笑面虎 笑面虎
2个月前
【完结14章】鸿蒙系统实战短视频App 从0到1掌握HarmonyOS
【完结14章】鸿蒙系统实战短视频App从0到1掌握HarmonyOS给大家分享一套视频课程——鸿蒙系统实战短视频App从0到1掌握HarmonyOS,已完结14章,附源码。大家下载学习。华为鸿蒙系统是一款全新的面向全场景的分布式操作系统,创造一个超级虚拟终
笑面虎 笑面虎
2个月前
【完结11章】技术大牛成长课,从0到1带你手写一个数据库系统
【完结11章】技术大牛成长课,从0到1带你手写一个数据库系统给大家分享一套数据库课程——技术大牛成长课,从0到1带你手写一个数据库系统,课程已完结,共11章,附源码。数据库系统是为适应数据处理的需要而发展起来的一种较为理想的数据处理系统,也是一个为实际可运
笑面虎 笑面虎
2个月前
【15章】前端高手特训 从0到1带你手写一个微信小程序底层框架
【15章】前端高手特训从0到1带你手写一个微信小程序底层框架视频课程分享——前端高手特训从0到1带你手写一个微信小程序底层框架,课程包更新,附源码。大家下载学习。微信小程序实质上是一款基于web技术的应用程序,他和我们平常所接触到的前端网页是大同小异的。相
笑面虎 笑面虎
2个月前
【完结12章】基于C++从0到1手写Linux高性能网络编程框架
【完结12章】基于C从0到1手写Linux高性能网络编程框架分享一套课程——基于C从0到1手写Linux高性能网络编程框架,已完结12章,附源码电子书。大家下载学习。Socket网络编程框架Socket(套接字)是一个网络编程概念,描述了一个通信
燕青 燕青
3个月前
Macos数据库开发工具:Navicat Premium 15 for Mac中文激活版 支持M1
是一款强大的数据库管理和开发工具,可以帮助用户轻松地管理、设计和维护各种数据库系统。以下是NavicatPremiumMac的一些主要特点和功能:跨平台支持:NavicatPremiumMac支持多种数据库系统,包括MySQL、MariaDB、Oracle