1、第一范式(1NF)
第一范式即表的字段必须原子性,不可以再分割。如果实体中的某个属性具有多个值时,必须拆分为多个属性。如在统计某商品的进销存信息时,不能将“销售”作为一个字段,因为销售包括了数量和金额甚至其它信息。
当然,表格字段设计得越详细,在做某些实际操作时会越方便,但也并不绝对。总之,范式应根据不同的业务场景而设计。
2、第二范式(2NF)
在满足1NF的前提下,除主键以外的任意一列,都完全依赖于主键(而不能是部分依赖)。
- 完全依赖:由一个或者一组联合属性能推出Y,即说Y完全依赖于X;
- 部分依赖:由一组联合属性的部分能推出Y,即说Y部分依赖于X,一般有联合主键时出现。那么此时不符合2NF的要求。
举例说明。
CREATE TABLE order(product_id int, product_name varchar(20),
customer_id int,customer_name varchar(20),
PRIMARY KEY(product_id, customer_id));
上表中,product_id和customer_id都部分依赖于联合主键,因此不符合2NF。要满足2NF,需要作拆表的操作。
CREATE TABLE order(order_id int, product_id int,
customer_id int,
PRIMARY KEY(order_int));
CREATE TABLE product(product_id int, product_name varchar(20),
PRIMARY KEY(product_id));
CREATE TABLE customer(customer_id int, customer_name varchar(20),
PRIMARY KEY(customer_id));
3、第三范式(3NF)
在满足2NF的 前提下,除开主键列的其他列之间不能有传递依赖关系。
如在以下的order表中,order_id为主键,但是customer_name还依赖于customer_id,造成了信息冗余,因此不满足第三范式。
CREATE TABLE order(order_id int, product_id int,
customer_id int,
customer_name varchar(20)
PRIMARY KEY(order_int));
更改的方法是将customer_name添加到customer表中。
总结,1NF告诉我们在设计表时要尽量依据业务的需要进行设计(不能过粗也不能过细),2NF和3NF告诉我们只有主键能且完全决定其它属性。
网友评论