资料
  • 资料
  • 专题
[完结11章]技术大牛成长课,从0到1带你手写一个数据库系统
推荐星级:
类别: 软件/EDA/IP
时间:2023-11-29
大小:4.78KB
阅读数:538
上传用户:学习菜鸟小弟弟
查看他发布的资源
下载次数
16
所需E币
0
ebi
新用户注册即送 300 E币
更多E币赚取方法,请查看
close
资料介绍
大家好,今天我将给大家分享关于如何开发一个数据库系统的知识,将从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<FieldError> errorList = result.getFieldErrors();
    for (FieldError error : errorList) {
        // 发生验证错误所对应的某一个属性
        String errorField = error.getField();
        // 验证错误的信息
        String errorMsg = error.getDefaultMessage();
        map.put(errorField, errorMsg);
    }
    return map;
}
一般来说,admin系统不会有主动注册功能,账号都是分配的,那么默认就会存在一个基本账户,这也是预先通过代码生成用户名和密码的。直接手动生成即可:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

同理,查询操作也是类似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"
            }
        }
    }
}

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

版权说明:本资料由用户提供并上传,仅用于学习交流;若内容存在侵权,请进行举报,或 联系我们 删除。
相关评论 (下载后评价送E币 我要评论)
  • G339 2023-12-09
    了解一下,谢谢!
没有更多评论了
  • 可能感兴趣
  • 关注本资料的网友还下载了
  • 技术白皮书