前言:
今天和大家探讨一道最近的面试题,面试回答描述的不是很清楚,所以在此记录一下。本篇文章主要讲解数据库设计的三大范式及其应用的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。
如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~
小威在此先感谢各位小伙伴儿了😁
以下正文开始
面试ing~
面试官:数据库中,在创建表时需要注意什么?
我:需要合理的创建索引和使用索引,balabala,开始吟唱…
面试官:除了索引呢?
我:在创建字段时,应注意字段合理使用char和varchar定义,需要满足三大范式(好久没看,没忽悠住面试官)
给自己挖了大坑…
现在来填补一下这个大坑!
第一范式(1NF)
第一范式要求数据库表中的每个字段都是原子性的,不可再分。换句话说,就是每个字段中不能包含多个值或重复的数据。此外,每个表必须具有唯一的标识符(主键),用来唯一地标识每一行。
比方说我们现在有一个存储顾客订单的数据库表,如果我们将顾客姓名和联系方式拆分成多个字段,就违反了第一范式。合理的做法是将每个顾客的信息存储为一行,并且为每一行添加一个唯一的标识符。
-- 错误定义(违反第一范式)
CREATE TABLE Orders (
OrderId INT PRIMARY KEY,
CustomerFirstName VARCHAR(50),
CustomerLastName VARCHAR(50),
CustomerPhone VARCHAR(20)
)
-- 正确定义
CREATE TABLE Orders (
OrderId INT PRIMARY KEY,
CustomerName VARCHAR(100),
CustomerPhone VARCHAR(20)
)
第二范式(2NF)
第二范式要求数据库表中的非主键字段完全依赖于主键,而不是依赖于主键的一部分。换句话说,如果某个字段与主键只有部分依赖关系,就需要将其拆分到另一个表中。
比如,我们有一个订单表,订单表包含的字段如下:
这个表格中的字段就违反了第二范式,因为"类别"字段只与"产品"字段相关,而与主键"订单号"无关。我们把它拆分为两个表格就对了,如下所示:
订单表:
产品表:
第三范式(3NF)
第三范式要求数据库表中的非主键字段之间没有传递依赖关系
。换句话说,如果一个字段可以通过其他非主键字段推导出来,就需要将其拆分到另一个表中。
以一个学生表为例,现在有以下字段,是不符合数据库第三范式的:
因为"教师"字段依赖于"课程"字段,而非主键"学号"。需要将它拆分为三个表格:
学生表:
课程表:
成绩表:
这样分表才符合数据库的第三大范式!.
小结
数据库的三大范式(1NF、2NF和3NF)给我们提供了一套指导原则,帮助我们用于设计高效、规范的关系型数据库。
第一范式确保每个字段都是原子性的,每个表具有唯一标识符;第二范式消除了非主键字段对主键的部分依赖;第三范式消除了非主键字段之间的传递依赖。
遵循数据库的范式的优点:
可以帮助我们设计出更加规范、高效的数据库结构,减少数据冗余、提高数据一致性,并减少数据更新异常的风险。
But,根据具体的业务需求,在某些情况下可能需要权衡范式的规则来满足特定的性能或灵活性需求。所以在数据库设计中,根据实际情况选择合适的范式还是非常重要滴~~~。
图书推荐
清华社【秋日阅读企划】领券立享优惠
IT好书 5折叠加10元 无门槛优惠券:点击领取
活动时间:9月4日-9月17日,先到先得,快快来抢
比较适合小白的MySQL数据库书籍,内容很不错,是32万数据库开发人员的首选。
京东直售五折链接:点我查看详情
文章到这里就先结束了,感兴趣的可以订阅专栏哈,后续会继续分享相关的知识点。