数据库设计的五大范式
第一范式:
对于表中的每一行,必须且仅仅有唯一的行值.在一行中的每一列仅有唯一的值并且具有原子性。(第一范式是通过把重复的组放到每个独立的表中,把这些表通过一对多关联联系起来这种方式来消除重复组的。) 即无重复列。也就是说每个列的属性值不能再分,比如cusLinkInfo还可在分为cusAddress和cusTel则违反了第一范式
第二范式:
第二范式要求满足第一范式后,非主键列必须完全依赖整个主键。主键必须有唯一性的元素,一个主键可以由一个或更多的组成唯一值的列组成。一旦创建,主键无法改变,外键关联一个表的主键。主外键关联意味着一对多的关系。而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情;
第三范式:
必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键);
BCNF 在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。候选关键字段不存在函数传递依赖,。
(1)所有非主属性对每一个码都是完全函数依赖;
(2)所有的主属性对于每一个不包含它的码,也是完全函数依赖;
(3)没有任何属性完全函数依赖于非码的任意一个组合。
R属于3NF,不一定属于BCNF,如果R属于BCNF,一定属于3NF。
假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:
(仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)
所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
(仓库ID) → (管理员ID)
(管理员ID) → (仓库ID)
即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。
第四范式:
第四范式禁止主键列和非主键列一对多关系不受约束。
第四范式用于处理由复杂的复合主键所导致的问题。如果将两个相互独立的属性与第三个属性一起组合为一个主键,并且如果没有第三个属性,仅靠这两个属性不能在实体中真正地起到唯一标识的作用,那么它就违反了第四范式;第四范式用来识别那些需要划分为多个不同的实体。通常,只有当很大的复合主键将过多的对象放到单个实体中的时候才会出现这样的问题。
第五范式:
第五范式将表分割成尽可能小的块,为了排除在表中所有的冗余。
PS.通常数据库设计满足第三范式即可,越往后付出代价越大;若追求性能,不一定遵循这些范式。
【数据库五大约束】
1.primary KEY:设置主键约束;
2.UNIQUE:设置唯一性约束,不能有重复值;
3.DEFAULT 默认值约束,height DOUBLE(3,2)DEFAULT 1.2 height不输入是默认为1,2
4.NOT NULL:设置非空约束,该字段不能为空;
5.FOREIGN key :设置外键约束。