所需E币: 0
时间: 2023-11-29 14:22
大小: 4.78KB
大家好,今天我将给大家分享关于如何开发一个数据库系统的知识,将从0到1手把手带着一步步去开发这个项目,希望我的分享对大家的学习和工作有所帮助,如果有不足的地方还请大家多多指正。一、什么是数据库系统数据库系统一般由数据库、数据库管理系统(及其开发工具)、应用系统、数据库管理员构成 二、数据库管理系统的主要功能包括数据定义功能:DBMS提供数据定义语言(DataDefinitionLanguage,DDL),用户通过它可以方便地对数据库中的对象进行定义数据组织、存储和管理:DBMS要分类组织、存储和管理各种数据,包括数据字典、用户数据、数据的存取路径等。数据操纵功能:DBMS提-供数据操纵语言(DataManipulationLanguage,DML),用户可以使用DML操纵数据,实现对数据库的基本操作,如查询、插入、删除和修改等数据库的事务管理和运行管理:数据库在建立、运用和维护时由数据管理系统统一管理、统一控制,以保证数据的安全性、完整性、多用户对数据的并发使用以及发生故障后的系统恢复数据库建立和维护功能:数据库初始数据的输入、转换功能,数据库的转储、恢复功能,数据库的重组织功能和性能监视、分析功能等。三、数据库系统结构1.1模式(概念模式或逻辑模式)定义:数据库中全体数据的逻辑结构特征的描述,是所有用户的公用数据库结构。特性:一个数据库只有一个模式模式与应用程序无关,只是数据的一个框架1.2子模式(外模式或用户模式)定义:数据库用户所见和使用的局部数据的逻辑结构和特征的描述,是用户所用的数据库结构特性:子模式是模式的子集一个数据库有多个子模式,每个用户至少使用一个子模式同一个用户可以使用不同的子模式,每个子模式可为不同的用户所用1.3内模式(存储模式)定义:是数据物理结构和存储方法的描述。它是整个数据库的最低层结构的表示。特性:一个数据库只有一个内模式,内模式对用户透明一个数据库由多种文件组成,如用户数据文件,索引文件及系统文件内模式设计直接影响数据库的性能以下是开发流程:在idea中构建如下几个子模块工程:@PostMapping("/doLogin")@ApiOperation(value="一键注册登录接口",notes="一键注册登录接口",httpMethod="POST")publicGraceJSONResultdoLogin(HttpServletRequestrequest, HttpServletResponseresponse, @RequestBody@ValidRegisterLoginBOregisterLoginBO, BindingResultresult);验证的字段上方可以写一些相关的注解,系统识别后会自动检查RegisterLoginBO.javapublicclassRegisterLoginBO{ @NotBlank(message="手机号不能为空") privateStringmobile; @NotBlank(message="短信验证码不能为空") privateStringsmsCode; publicStringgetMobile(){ returnmobile; } publicvoidsetMobile(Stringmobile){ this.mobile=mobile; } publicStringgetSmsCode(){ returnsmsCode; } publicvoidsetSmsCode(StringsmsCode){ this.smsCode=smsCode; } @Override publicStringtoString(){ return"RegisterLoginBO{"+ "mobile='"+mobile+'\''+ ",smsCode='"+smsCode+'\''+ '}'; }}如果校验有问题,那么可以直接获得并且放回给前端即可。BaseController.java/** *验证beanBO中的字段错误信息 *@paramresult *@return */publicMap<String,String>getErrors(BindingResultresult){ Map<String,String>map=newHashMap<>(); List<FieldError>errorList=result.getFieldErrors(); for(FieldErrorerror:errorList){ //发生验证错误所对应的某一个属性 StringerrorField=error.getField(); //验证错误的信息 StringerrorMsg=error.getDefaultMessage(); map.put(errorField,errorMsg); } returnmap;}一般来说,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")publicGraceJSONResultgetFriendLinkList();首先可以在数据库通过写sql脚本实现查询SELECTc.idascommentId,c.father_idasfatherId,c.article_idasarticleId,c.comment_user_idascommentUserId,c.comment_user_nicknameascommentUserNickname,c.contentascontent,c.create_timeascreateTime,f.comment_user_nicknameasquoteUserNickname,f.contentasquoteContentFROMcommentscLEFTJOINcommentsfonc.father_id=f.idWHEREc.article_id='2006117B57WRZGHH'orderbyc.create_timedesc目前我们所搭建的eureka是单机单实例的注册中心,如果挂了,那么整个微服务体系完全不可以,这是不应该的,所以为了实现eureka的高可用,我们可以搭建集群。在进行集群构建之前,大家先参照目前的eureka再去构建一个一模一样的工程,可以取名为springcloud-eureka-cluster。为集群中各个eureka节点配置hosteureka: 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中设置基本参数:@OverridepublicObjectrun()throwsZuulException{ System.out.println("执行【IP黑名单】Zuul过滤器..."); //获得上下文对象requestContext RequestContextrequestContext=RequestContext.getCurrentContext(); HttpServletRequestrequest=requestContext.getRequest(); //获得ip Stringip=IPUtil.getRequestIp(request); /** *需求: *判断ip在10秒内请求的次数是否超过10次, *如果超过,则限制访问15秒,15秒过后再放行 */ finalStringipRedisKey="zuul-ip:"+ip; finalStringipRedisLimitKey="zuul-ip-limit:"+ip; //获得剩余的限制时间 longlimitLeftTime=redis.ttl(ipRedisLimitKey); //如果剩余时间还存在,说明这个ip不能访问,继续等待 if(limitLeftTime>0){ stopRequest(requestContext); returnnull; } //在redis中累加ip的请求访问次数 longrequestCounts=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); } returnnull;}privatevoidstopRequest(RequestContextrequestContext){ //停止继续向下路由,禁止请求通信 requestContext.setSendZuulResponse(false); requestContext.setResponseStatusCode(200); Stringresult=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功能做聚合统计,会更好。通过一个脚本来统计男女数量:POSThttp://192.168.1.203:9200/fans/_doc/_search{ "size":0, "query":{ "match":{ "writerId":"201116760SMSZT2W" } }, "aggs":{ "counts":{ "terms":{ "field":"sex" } } }}以下就是数据库系统开发的整个流程讲解,感谢大家的阅读