数据库三范式 冷不防 2021-09-27 17:10 399阅读 0赞 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。 目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。 范式越高,冗余最低,一般到三范式,再往上,表越多,可能导致查询效率下降。所以有时为了提高运行效率,可以让数据冗余(反三范式,一般某个数据经常被访问时,比如数据表里存放了语文数学英语成绩,但是如果在某个时间经常要得到它的总分,每次都要进行计算会降低性能,可以加上总分这个冗余字段)。 后面的范式是在满足前面范式的基础上,比如满足第二范式的一定满足第一范式。 **第一范式(1NF):确保每一列的原子性** 如果每一列都是不可再分的最小数据单元,则满足第一范式。 <table> <tbody> <tr> <td> <p>id</p> </td> <td> <p>地址</p> </td> </tr> <tr> <td> <p>1</p> </td> <td> <p>中国广东</p> </td> </tr> <tr> <td> <p>2</p> </td> <td> <p>中国云南</p> </td> </tr> </tbody> </table> 上面的表地址字段其实可以继续分: <table> <tbody> <tr> <td> <p>id</p> </td> <td> <p>国家</p> </td> <td> <p>省份</p> </td> </tr> <tr> <td> <p>1</p> </td> <td> <p>中国</p> </td> <td> <p>广东</p> </td> </tr> <tr> <td> <p>2</p> </td> <td> <p>中国</p> </td> <td> <p>云南</p> </td> </tr> </tbody> </table> 但是具体地址到底要不要拆分 还要看具体情形,比如看看将来会不会按国家或者省市进行分类汇总或者排序,如果需要,最好就拆,如果不需要而仅仅起字符串的作用,可以不拆,操作起来更方便。 **第二范式:非键字段必须依赖于键字段** 如果一个关系满足1NF,并且除了主键以外的其它列,都依赖与该主键,则满足二范式(2NF),第二范式要求每个表只描述一件事。 例如: <table> <tbody> <tr> <td>字段</td> <td> <p>例子</p> </td> </tr> <tr> <td> <p>订单编号</p> </td> <td> <p>001</p> </td> </tr> <tr> <td> <p>产品编号</p> </td> <td> <p>a011</p> </td> </tr> <tr> <td> <p>订购日期</p> </td> <td> <p>2017-4-8</p> </td> </tr> <tr> <td> <p>价格</p> </td> <td> <p>¥30</p> </td> </tr> </tbody> </table> 而实际上,产品编号与订单编号并没有明确的关系,订购日期与订单编号有关系,因为一旦订单编号确定下来了,订购日期也确定了,价格与订单编号也没有直接关系,而与产品有关,所以上面的表实际上可以拆分: 订单表: <table> <tbody> <tr> <td> <p>订单编号</p> </td> <td> <p>001</p> </td> </tr> <tr> <td> <p>日期</p> </td> <td> <p>2017-4-8</p> </td> </tr> </tbody> </table> 产品表: <table> <tbody> <tr> <td> <p>产品编号</p> </td> <td> <p>a011</p> </td> </tr> <tr> <td> <p>价格</p> </td> <td> <p>¥30</p> </td> </tr> </tbody> </table> **第三范式:在1NF基础上,除了主键以外的其它列都不传递依赖于主键列,或者说: 任何非主属性不依赖于其它非主属性** **(在2NF基础上消除传递依赖)****【**必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键);**】** 例如: <table> <tbody> <tr> <td> <p>字段</p> </td> <td> <p>例子</p> </td> </tr> <tr> <td> <p>订单编号</p> </td> <td> <p>001</p> </td> </tr> <tr> <td> <p>订购日期</p> </td> <td> <p>2017-4-8</p> </td> </tr> <tr> <td> <p>顾客编号</p> </td> <td> <p>a01</p> </td> </tr> <tr> <td> <p>顾客姓名</p> </td> <td> <p>howard</p> </td> </tr> </tbody> </table> 上面的满足第一和第二范式,但是不满足第三范式,原因如下: 通过顾客编号可以确定顾客姓名,通过顾客姓名可以确定顾客编号,即在这个订单表里,这两个字段存在传递依赖,只需要一个就够了。 又如: <table> <tbody> <tr> <td> <p>主键</p> </td> <td> <p>学号</p> </td> <td> <p>姓名</p> </td> <td> <p>成绩</p> </td> </tr> <tr> <td> <p>1</p> </td> <td> <p>111</p> </td> <td> <p>howard</p> </td> <td> <p>90</p> </td> </tr> <tr> <td> <p>2</p> </td> <td> <p>222</p> </td> <td> <p>tom</p> </td> <td> <p>90</p> </td> </tr> </tbody> </table> 上面的表,学号和姓名存在传递依赖,因为(学号,姓名)->成绩,学号->成绩,姓名->成绩。所以学号和姓名有一个冗余了,只需要保留一个。 总结: 第1范式:每个表中都有1列,并且该列是不可拆分的最小单元 第2范式:1张表只描述一件事情 第3范式:用外键做表的关联 **【数据库五大约束】** 1.primary KEY:设置主键约束; 2.UNIQUE:设置唯一性约束,不能有重复值; 3.DEFAULT 默认值约束,height DOUBLE(3,2)DEFAULT 1.2 height不输入是默认为1,2 4.NOT NULL:设置非空约束,该字段不能为空; 5.FOREIGN key :设置外键约束。 **【主键】** 1.主键的注意事项? 主键默认非空,默认唯一性约束,只有主键才能设置自动增长,自动增长一定是主键,主键不一定需要自动增长; 2.设置主键的方式? 在定义列时设置:ID INT PRIMARY KEY 在列定义完之后设置:primary KEY(id) **【外键】** 1.设置外键的注意事项: 只有INNODB的数据库引擎支持外键,修改my.ini文件设置default-storage-engine=INNODB 外键必须与参照列的数据类型必须相同(数值型要求长度和无符号都相同,字符串要求类型相同,长度可以不同)。 2设置外键的语法: CONSTRAINT 外键名 FOREIGN KEY (外键字段)REFERENCES 参照表 (参照字段) ON DELETE SET NULL ON UPDATE CASCADE 设置参照完整性 3.外键约束的参照操作? 参照表的完整性操作:当对参照表的参照字段进行删除或更新时,外键表中的外键如何应对; 参照操作可选值: RESTRICT拒绝参照表删除或更新参照字段; RESTRICT和NO ACTION相同,但这个指令只在mysql生效; CASCADE删除或更新参照表的参照字段时,外键表的记录同步删除更新; SET NULL 删除或更新参照表的参照字段时,外键表的外键设为NULL;
相关 数据库三范式 第三范式(3NF):如果关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递信赖,则称关系R是属于第三范式的。 当然,这里要把1、2、3、4范式都讲一下。 短命女/ 2022年09月25日 12:16/ 0 赞/ 161 阅读
相关 数据库(第一范式,第二范式,第三范式) ◆ 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。 考虑这样一个表:【联系人】(姓名,性别,电话) 如果在实际场景中,一个联系人有家庭电话和公司电话 朴灿烈づ我的快乐病毒、/ 2022年09月24日 01:27/ 0 赞/ 237 阅读
相关 数据库三范式 第一范式 表中所有字段仅包含单值 第二范式 表中的每个非键字段由整个主键决定,且不能由主键自身的一部分确定。(有的主键由多个字段组成) 第三范式 表中不存 旧城等待,/ 2022年07月14日 06:42/ 0 赞/ 199 阅读
相关 数据库三范式 第一范式1NF:数据库表的每一列都不可再分。 不满足1NF的情况: ![image\_1b6jj0ei4l2i3opqfhrtk16nb9.png-25.5kB][imag 灰太狼/ 2022年07月11日 04:27/ 0 赞/ 218 阅读
相关 数据库三范式 第一范式:属性不可再分 第二范式:消除局部依赖。(依赖的定义:通过这个值可以定义其他值,那么他们之间就产生依赖关系。) 如图所示违反第二范式: ![70][] 因为有局 傷城~/ 2022年05月15日 12:45/ 0 赞/ 268 阅读
相关 数据库三范式 关系数据库的几种设计范式介绍 1、第一范式(1NF) 在任何一个关系数据库中,第一范式(1NF)是对[关系模式][Link 1]的基本要求,不满足第一范式(1NF)的数 淩亂°似流年/ 2022年04月17日 04:47/ 0 赞/ 241 阅读
相关 数据库三范式 关系型数据库设计是很重要的一门学科,设计的好坏与否,直接影响到后续业务性能。遵从数据库方式进行数据库设计,将极大程度上是的数据冗余变少,后续整个数据库的性能,维护与管理都将变得 骑猪看日落/ 2022年04月15日 07:07/ 0 赞/ 287 阅读
相关 数据库三范式 为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须 灰太狼/ 2022年03月06日 08:16/ 0 赞/ 302 阅读
相关 数据库三范式 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。 目 冷不防/ 2021年09月27日 17:10/ 0 赞/ 400 阅读
相关 数据库三范式 第一范式(1NF) 字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式。 数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必须作为一个 ゝ一纸荒年。/ 2021年06月24日 16:11/ 0 赞/ 454 阅读
还没有评论,来说两句吧...