介绍一下数据库设计的三范式
第一范式:表不可再分 第二范式:消除了非主属性对主属性的部分函数依赖 第三范式:消除了非主属性对主属性的传递函数依赖 数据库设计的三范式是数据规范化的一种方法,是针对关系数据库设计的理论。第一范式要求每个列的值都是不可再分的原子值;第二范式要求所有非主键属性必须完全依赖于整个主键,而不是依赖于主键的某一部分;第三范式要求非主键属性之间不能存在传递依赖关系,即所有数据必须直接依赖于候选键或主键。遵循三范式原则可以减少数据冗余,提高数据存储的效率和一致性。
以一个学生信息管理系统为例来解释三个范式:
1. 第一范式(1NF):假设我们有一个学生表格,包含学生的姓名、年龄和电话号码。
姓名字段已经是原子性的,但是电话号码字段包含了多个电话号码,不符合第一范式。
为了符合第一范式,我们可以将电话号码字段拆分成单独的列,每一列只存储一个电话号码。
2. 第二范式(2NF):如果我们将学生表格拆分成学生表和课程表,学生表包含学生ID、
姓名和年龄,课程表包含学生ID、课程ID和成绩。
这里学生ID是主键,但是成绩字段只依赖于部分主键(学生ID),
不符合第二范式。为了符合第二范式,我们可以将成绩字段移动到学生表中,
确保所有非主键属性都完全依赖于整个主键。
3. 第三范式(3NF):假设我们有一个老师表格,包含老师ID、姓名和所在部门,
其中部门和老师ID之间存在依赖关系。虽然部门依赖于老师ID,
但是也可以通过老师姓名间接获取部门信息,存在传递依赖。
为了符合第三范式,我们可以创建一个新的部门表,将部门信息存储在独立的表格中,
避免传递依赖关系。
在有很多张表连接的非常复杂的查询时如何优化
主要解决问题所考虑的角度:
- 优化查询中的连接
- 优化表的索引
- 优化查询中的查询条件
- 从底层执行计划进行优化
- 使用explain对查询的执行情况进行分析
要使用explain进行查询情况的分析,只需在查询语句前添加”explain”关键字即可。例如:如果我们要分析一条查询语句SELECT * FROM table_name WHERE column_name = ‘value’; 可以将它改写为EXPLAIN SELECT * FROM table_name WHERE column_name = ‘value’; 执行这条语句后,数据库会返回一些关于查询执行计划的信息,包括使用的索引、访问数据的方式、行数等。通过这些信息,我们可以判断查询语句执行效率、是否使用了索引等情况,从而进行优化和调整。
数据库进行复杂查询时,如何优化查询的响应时间
与上面一道题的区别,在于面试官在这个题中想从系统、架构方面给出解决或优化方案,上一题则偏向于只考虑数据库本身。
- 考虑使用Redis、memcache等,作为MySQL的缓存层
- 使用主从数据库进行读写分离:
一般业务中,读操作频度远大于写操作,容易成为性能瓶颈,将数据库分为主从两个,主数据库负责写操作,从数据库定时从主数据库中同步数据,负责处理读操作。
- 分布式部署:
在仅适用主从架构的基础上进一步优化,部署多个数据库集群,每一个集群中再进行主从读写分离。