发表于: 2018-10-13 23:02:53
1 684
今天完成的事情:
完成了任务三脑图:
1.什么是数据库范式,是否应该严格遵守范式,什么情况下应该不遵守范式? 点击查看相关小课堂
设计关系型数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求称为不同的范式,各种范式呈递次规范,越高的规范数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。一般来说数据库满足第三范式就行了。
第一范式:是指在关系模型中对域添加一个规范要求,说有的域都应是原子性的,即数据库的每一列都是不可分割的原子数据项,而不能是集合、数组(实体的属性有多个值时,必须拆分为不同的属性)。符合第一范式的表中每个域值只能是实体的一个属性或者是一个属性的一部分,1NF没有重复的域。是否满足第一范式,主要依赖于所使用的关系性模型。
第二范式(1NF基础上消除主属性对主码的部分函数依赖?):以第一范式为基础,要求数据库表中的每个实例或记录必须唯一地区分。选取一个能区分每个实体的属性和属性组,作为实体的唯一标识(比如姓名相同时,利用身份证号码区分或者是建主键id类区分)。2NF要求实体的属性完全依赖与主关键字。所谓完全依赖是指不能存在仅依赖主关键字的一部分属性。若存在应该将这个属性和主关键字的一部分分离出来。
第三范式:任何非主属性不依赖与其他非主属性(在2NF基础上消除传递依赖)。3NF要求一个关系表中不包含已在其他关系已包含的非主关键字信息。(比如任务三建立的表中,二级作品集表中只需要加入一级作品集的id即可,不要加入一级作品集的其他信息)
第一范式:对于表中的每一行,必须且仅仅有唯一的行值.在一行中的每一列仅有唯一的值并且具有原子性.
第二范式要求非主键列是主键的子集,非主键列活动必须完全依赖整个主键。主键必须有唯一性的元素,一个主键可以由一个或更多的组成唯一值的列组成。一旦创建,主键无法改变,外键关联一个表的主键。主外键关联意味着一对多的关系.
第三范式要求非主键列互不依赖.
第四范式禁止主键列和非主键列一对多关系不受约束
第五范式将表分割成尽可能小的块,为了排除在表中所有的冗余.
范式只是为了可以理清数据库的关系的,但是有些情况采用范式的代价要比不采用范式的代价大就可以不适用范式。比如增加了程序逻辑,多联接关系表,不常更新或不更新的基础表信息都可以不必须按照范式的规范来设计。
2.在端到端的请求当中,建立Http连接需要多久,Model通过JSP转成Json需要多久,Nginx调用Resin需要多久,Service访问DB需要多久,一个Sql语句执行的时间是多久。
http连接建立时间:
nginx请求时间和响应时间:
controller和service执行时间:
我这里service里是两个方法(查询所有页数8ms和查询列表11ms)就是访问db的时间。
Jsp转成json的时间为1ms
3.什么是Sql注入,应该怎么解决?对于未做SQL注入防范的程序,你可以直接通过调用接口删掉表吗? 点击查看相关小课堂
sql注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作
造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码。
防止策略
1.严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害
2检查输入的数据是否具有所期望的数据格式,严格限制变量的类型
3.对进入数据库的特殊字符(’” \ 尖括号 & * ;等符号)进行转义处理,或编码转换。
在应用发布之前建议使用专业的SQL注入检测工具进行检测,以及时修补被发现的SQL注入漏洞。网上有很多这方面的开源工具,例如sqlmap、SQLninja等。
4.在内存里拼装数据会节省时间吗?如果不能,为什么要选择单表查询,而不是直接拼装成Sql语句。
不能;拼装SQL会很占用数据库的性能。拼装数据可以节省数据库性能,降低了高并发时资源消耗和业务之间的耦合。
5.为什么一般而言,不允许使用连表查询,不允许使用复杂的Group By等语句,为什么不允许使用存储过程? 点击查看相关小课堂
不用连表查询的原因
1.mysql连表查询是比较慢的,相比先查出一个表的记录,然后再查另外一个表。
2.单表查询的数据方便做缓存。
3.连表查询是会锁多表,单表查询只锁单表。
4.如果以后需要分库分表,连表的sql语句就需要改了
就是说使用联表查询和存储过程在一定程度上会占用数据库的性能,把这些逻辑放在Java代码中处理可以节省数据库的性能,跨多个表的join查询在大数据量下需要的对比与运算量是会急速增长的,减少join除了直观地降低了高并发状态下的资源消耗外,更大的好处是降低了业务之间的耦合,增加了扩展性。
6.为什么响应时间一般不允许超过200MS,怎么查看一个请求从发起到结束,耗费在什么地方了?
200毫秒这个时间对于用户来说是没有明显感觉的,当时间超过200ms,用户会察觉到慢,影响用户体验。
使用network工具查看
7.为什么要自测,仅仅使用Postman来测试足够吗?什么是本地测试,什么是在开发环境测试?在开发过程中,应该每天部署代码到开发环境吗,为什么?
自测是为了减少开发阶段存在的
8.保存图片有几种方式?什么样的情景下应该使用哪一种?
有两种方式,一种是以二进制流的形式存入数据库。还有一种是在数据库存储图片地址,图片存储本地或者是第三方。
9.为什么要先写单元测试?单元测试应该包括哪些?在正式打包的过程中,什么样的单元测试应该被屏蔽?在Maven里用什么方法可以跳过单元测试,单元测试应该被跳过吗。
Web开发时写单元测试是为了方便测试,通过单元测试来确定dao层和service层的正确定性。直接使用浏览器测试会很麻烦,容易出错。
Maven中跳过单元测试有两种方法,加依赖,关闭test按钮。
10.为什么提供假数据的时候要求,直接Controller接收请求,在JSP中写死数据返回以用做假数据?为什么提供假数据的时候要求数据完整,有分页尽可能给分页,数据尽可能真实?
尽可能模拟真实场景。提前发现问题。
11.为什么要写假数据,前后端联调的时候,应该什么时候商定接口文档,接口文档应该谁来维护,如果不提供假数据,会发生什么问题?
假数据是为了前后端同时开发;后端的开发不依赖于前端,而前端的动态页面则需要后端给出的数据支持,所以需要前后端共同定义接口文档,确定接口返回的数据结构,数据类型和对象名称等等。
接口文档由前后端共同维护。
不提供假数据,会导致开发效率较低,前后端联调是很容易出现问题。
12.接口应该怎么定义?一个页面应该只对应一个接口吗?还是一个实体对应一个接口,让前端去组装数据?两者的使用场景是什么?
接口定义:易读;简单名了,调用简单,清晰明了;功能独立;易于扩展
设计原则:尽量保证功能的单一性,功能单一的接口便于敏捷开发和调试,容易定位出问题;函数名称清晰明了;实现永远不要影响接口;最小化访问,尽量使用私有成员变量,注意信息隐藏;注意写接口文档与注释;提高接口性能,不同开发实现一个功能的代码也不同,要尽可能提高接口性能。
一个页面可以对应多个接口,一个实体也对应多个接口。
13.多层分类应该怎么设计表结构,分别有什么问题?像文章分类这种需求,如果分类不确定,级别不确定,有可能动态调整,数据量和访问量又比较大,该怎么去设计?
14.什么是实体表,什么是关系表,一对多和多对多应该怎么设计表?
实体表就是实体对应的对象的表,关系表是指形容对象之间的关系的表。
一对多关系时设计两张实体表,在其中一张表中(一对多关系的多)加入另一张表的主键id(一对多关系的一)
多对多关系时,除了需要两张实体表外还需要一张关系表,关系表需要有两张实体表的主键字段。
15.什么是外键,用处是什么,为什么不建议使用外键做关联?
外键是表示了两个关系之间的相关联系,有一个主表和一个从表,外键也成为外关键字。如果公共关键字在一个关系中为主关键字,那么在另一个关系中他就是外键(一对多关系时,多中的一的主关键字(主键id))。
作用:保持数据的完整性和一致性,主要目的是控制存储在外键表中的数据,是两张表形成关联,外键只能引用外表中的列值或者是空值。
不使用外键做关联这里指的是不使用外键约束,外键适用于不经常变动的情况,但现在的网站和app是在不断更新迭代的,就是说数据库的结构可能发上变动。现在的设计原则是将关系交给逻辑层来做,不需要在数据库中加约束。样的好处是,一旦你的业务逻辑变了,不需要更改数据库结构,在业务代码里修改即可。
16.Mysql的一般而言应该配置多大的内存, 多大的硬盘 ,多大的连接数?
一般配置8M的内存。
最大连接数:1000
明天计划的事情:
遇到的问题:
收获:完成了任务三深度思考。
评论