当前位置: 首页 > news >正文

数据库三范式

     设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
      目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
      范式越高,冗余最低,一般到三范式,再往上,表越多,可能导致查询效率下降。所以有时为了提高运行效率,可以让数据冗余(反三范式,一般某个数据经常被访问时,比如数据表里存放了语文数学英语成绩,但是如果在某个时间经常要得到它的总分,每次都要进行计算会降低性能,可以加上总分这个冗余字段)。
      后面的范式是在满足前面范式的基础上,比如满足第二范式的一定满足第一范式。

第一范式(1NF):确保每一列的原子性
如果每一列都是不可再分的最小数据单元,则满足第一范式。

id

地址

1

中国广东

2

中国云南

上面的表地址字段其实可以继续分:

id

国家

省份

1

中国

广东

2

中国

云南

但是具体地址到底要不要拆分 还要看具体情形,比如看看将来会不会按国家或者省市进行分类汇总或者排序,如果需要,最好就拆,如果不需要而仅仅起字符串的作用,可以不拆,操作起来更方便。

第二范式:非键字段必须依赖于键字段
如果一个关系满足1NF,并且除了主键以外的其它列,都依赖与该主键,则满足二范式(2NF),第二范式要求每个表只描述一件事。
例如:

字段

例子

订单编号

001

产品编号

a011

订购日期

2017-4-8

价格

¥30

而实际上,产品编号与订单编号并没有明确的关系,订购日期与订单编号有关系,因为一旦订单编号确定下来了,订购日期也确定了,价格与订单编号也没有直接关系,而与产品有关,所以上面的表实际上可以拆分:
订单表:

订单编号

001

日期

2017-4-8

产品表:

产品编号

a011

价格

¥30

第三范式:在1NF基础上,除了主键以外的其它列都不传递依赖于主键列,或者说: 任何非主属性不依赖于其它非主属性

(在2NF基础上消除传递依赖)必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键);

例如:

字段

例子

订单编号

001

订购日期

2017-4-8

顾客编号

a01

顾客姓名

howard

上面的满足第一和第二范式,但是不满足第三范式,原因如下:

通过顾客编号可以确定顾客姓名,通过顾客姓名可以确定顾客编号,即在这个订单表里,这两个字段存在传递依赖,只需要一个就够了。
又如:

主键

学号

姓名

成绩

1

111

howard

90

2

222

tom

90

上面的表,学号和姓名存在传递依赖,因为(学号,姓名)->成绩,学号->成绩,姓名->成绩。所以学号和姓名有一个冗余了,只需要保留一个。

总结:

第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; 
 

相关文章:

  • io和nio的区别
  • oralce的下载和安装
  • 向oracle中插入图片和读取图片
  • JDK、STS、SVN、Tomcat 、mysql的下载安装及环境变量的配置和sts修改字体大小
  • SM1、SM2 、SM3、 SM4算法
  • 解决java.net.ConnectException: Connection refused:connect报错
  • 密码学和Base64
  • 对称密钥算法与非对称密钥算法
  • 秘钥管理和PKI
  • java安全体系:JCA、JCE、JSSE、JAAS
  • 下载安装Bouncy Castle 密码包之静态方法
  • 解决Exception in thread main java.lang.Error: Unresolved compilation problem:Syntax error...报错
  • ASN.1概述及数据类型详解、站点证书的下载
  • 数字信封
  • X.509数字证书
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • HashMap剖析之内部结构
  • Java,console输出实时的转向GUI textbox
  • Laravel核心解读--Facades
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • SpingCloudBus整合RabbitMQ
  • springboot_database项目介绍
  • Zepto.js源码学习之二
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 从0到1:PostCSS 插件开发最佳实践
  • 服务器从安装到部署全过程(二)
  • 机器学习学习笔记一
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • Linux权限管理(week1_day5)--技术流ken
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 容器镜像
  • ​低代码平台的核心价值与优势
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (11)MSP430F5529 定时器B
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (day 12)JavaScript学习笔记(数组3)
  • (二)JAVA使用POI操作excel
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (三分钟)速览传统边缘检测算子
  • (译)2019年前端性能优化清单 — 下篇
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET 中什么样的类是可使用 await 异步等待的?
  • @SentinelResource详解
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [Android] Android ActivityManager
  • [C# 网络编程系列]专题六:UDP编程
  • [C#]C#学习笔记-CIL和动态程序集
  • [C/C++]数据结构 深入挖掘环形链表问题