您的位置:首页 > 数据库

数据库基础——范式和约束

2018-03-07 09:32 225 查看
原文出处: 数据库基础知识:数据库中的约束和三大范式
一.数据库中的范式:  范式, 英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法,以下就是对这三个范式的基本介绍:第一范式(1NF)数据表中的每一列(字段),必须是不可拆分的最小单元,也就是确保每一列的原子性。
简而言之,第一范式就是无重复的列。例如,由“职工号”“姓名”“电话号码”组成的表(一个人可能有一部办公电话和一部移动电话),这时将其规范化为1NF可以将电话号码分为“办公电话”和“移动电话”两个属性,即职工(职工号,姓名,办公电话,移动电话)。第二范式(2NF):  满足1NF后要求表中的所有列,都必需依赖于主键,而不能有 任何一列与主键没有关系(一个表只描述一件事情)。  例如:订单表只能描述订单相关的信息,所以所有的字段都必须与订单ID相关。
                  产品表只能描述产品相关的信息,所以所有的字段都必须与产品ID相关。
        因此在同一张表中不能同时出现订单信息与产品信息。第三范式(3NF):满足2NF后,要求:表中的每一列都要与主键直接相关,而不是间接相关(表中的每一列只能依赖于主键)  例如:订单表中需要有客户相关信息,在分离出客户表之后,订单表中只需要有一个用户
       ID即可,而不能有其他的客户信息,因为其他的用户信息是直接关联于用户ID,而不是关联
       于订单ID。注意事项:1.第一范式与第二范式的本质区别:在于有没有分出两张表。第二范式是说一张表中包含了多种不同实体的属性,那么必须要分成多张表,第三范式是要求已经分好了多张表的话,一张表中只能有另一张标的ID,而不能有其他任何信息,(其他任何信息,一律用主键在另一张表中查询)。2.必须先满足第一范式才能满足第二范式,必须同时满足第一第二范式才能满足第三范式。
4、BCNF(BC范式):第三范式的扩展和加强它构建在第三范式的基础上,如果关系模型R是第一范式,且每个属性都不传递依赖于R的候选键,那么称R为BCNF的模式。这里用网上看到的一个例子:表结构: 仓库id     管理员id    物品id    物品数量其中管理员和仓库的关系是一对一,仓库和物品的关系是一对多;这个设计符合第一、二、三范式,即每列不可分割、主键唯一且不存在传递依赖;可看到依赖关系有 管理员id 依赖  仓库id, 物品id 依赖 仓库id。 即存在主键到主键再到非主键的传递依赖关系。这里的主要问题是,仓库id和管理员id这两个关键字段之间的关系被耦合到每一个实例中了,这导致:a) 表中没有数据的时候,无法描述仓库和管理员之间的关系b) 一个仓库的管理员替换后,表中所有含有该仓库的实例中的管理员id都要被修改解决办法是将二者的关系提出来单独建表。则原表结构改为:仓库id   物品id    物品数量增加表的结构: 仓库id     管理员id这样 仓库和管理员的关系 及 仓库和物品的关系 就解耦合了。存在关键字段决定关键字段的情况,因此其不符合BCNF。把仓库管理关系表分解为两个关系表仓库管理表(仓库号,管理员号)和仓库表(仓库号,存储物品号,数量),这样这个数据库表是符合BCNF的,并消除了删除异常、插入异常和更新异常。5、4NF(第四范式)设R是一个关系模型,D是R上的多值依赖集合。如果D中存在凡多值依赖X->Y时,X必是R的超键,那么称R是第四范式的模式。必须先满足第三范式。简单来说就是将表中的多值属性拆分出来,分别建表。例如,职工表(职工编号,职工孩子姓名,职工选修课程),在这个表中,同一个职工可能会有多个职工孩子姓名,同样,同一个职工也可能会有多个职工选修课程,即这里存在着多值事实,不符合第四范式。如果要符合第四范式,只需要将上表分为两个表,使它们只有一个多值事实,例如职工表一(职工编号,职工孩子姓名),职工表二(职工编号,职工选修课程),两个表都只有一个多值事实,所以符合第四范式。拓展:各范式的关系图如下所示:

二:数据库中的五大约束:数据库中的五大约束包括:1.主键约束(Primay Key Coustraint) 唯一性,非空性;2.唯一约束 (Unique Counstraint)唯一性,可以空,但只能有一个;3.默认约束 (Default Counstraint) 该数据的默认值;4.外键约束 (Foreign Key Counstraint) 需要建立两表间的关系;5.非空约束(Not Null Counstraint):设置非空约束,该字段不能为空。详细介绍:(1)[外键约束 (Foreign Key Counstraint) ]
1.设置外键的注意事项:
  ①:只有INNODB的数据库引擎支持外键,修改my.ini文件设置default-storage-engine=INNODB;
  ②:外键与参照列的数据类型必须相同。(数值型要求长度和无符号都相同,字符串要求类型相同,长度可以不同);
  ③:设置外键的字段必须要有索引,如果没有索引,设置外键时会自动生成一个索引;

2.设置外键的语法:
[CONSTRAINT 外键名] FOREIGN KEY(外键字段) REFERENCES 参照表(参照字段);
[ON DELETE SET NULL ON UPDATE CASCADE] -- 设置操作完整。3、外键约束的参照操作:
当对参照表的参照字段进行删除或更新时,外键表中的外键如何应对。
参照操作可选值:
  RESTRICT: 拒绝对参照字段的删除或修改(默认);
  NO ACTION:与RESTRICT相同,但这个指令只在MySql生效;
  CASCADE:  删除或更新参照表的参照字段时,外键表的记录同步删除或更新;
  SET NULL: 删除删除或更新参照表的参照字段时,外键表的外键设为NULL (此时外键不能设置为NOT NULL)。(2)[主键约束](Primay Key Coustraint) 
1.主键的注意事项:主键默认非空,默认唯一性约束,只有主键可以设置自动增长(主键不一定自增,自增一定是主键)。
2.设置主键的方式:  ①:在定义列时设置:id     INT UNSIGNED PRIMARY KEY。
  ②:在列定义完成后设置:PRIMARY KEY(id)。其他约束没有特殊要求因此不做解释。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: