1NF
数据表中的所有字段都是不可分割的原子值
mysql> create table student2( id int primary key, name varchar(20), address varchar(30) );
mysql> insert into student2 values(1,'张三','中国江苏省无锡市');
mysql> insert into student2 values(2,'李四','中国江苏省南京市');
mysql> insert into student2 values(3,'王五','中国上海上海市');
mysql> select * from student2;
+----+--------+--------------------------+
| id | name | address |
+----+--------+--------------------------+
| 1 | 张三 | 中国江苏省无锡市 |
| 2 | 李四 | 中国江苏省南京市 |
| 3 | 王五 | 中国上海上海市 |
+----+--------+--------------------------+
3 rows in set (0.00 sec)
字段值还可以继续拆分的就不满足第一范式,字段不可拆分满足第一范式
mysql> create table student3( id int primary key, name varchar(20),country varchar(30),provence varchar(30),city varchar(30) );
mysql> insert into student3 values(1,'张三','中国','江苏省','无锡市');
mysql> insert into student3 values(2,'李四','中国','江苏省','南京市');
mysql> insert into student3 values(3,'王五','中国','上海','上海市');
mysql> select * from student3;
+----+--------+---------+-----------+-----------+
| id | name | country | provence | city |
+----+--------+---------+-----------+-----------+
| 1 | 张三 | 中国 | 江苏省 | 无锡市 |
| 2 | 李四 | 中国 | 江苏省 | 南京市 |
| 3 | 王五 | 中国 | 上海 | 上海市 |
+----+--------+---------+-----------+-----------+
3 rows in set (0.00 sec)
范式设计的越详细对于某些实际操作可能更好,但不一定都是好处,以实际需求决定。
2NF
必须满足第一范式的前提下,第二范式要求除主键外的每一列都必须完全依赖于主键。
如果要出现不完全依赖,只可能发生在联合主键的情况下。
create table myorder(
product_id int,
consumer_id int,
product_name varchar(20),
consumer_name varchar(20),
primary key(product_id,consumer_id)
);
除主键以外的列只依赖于主键的部分字段。
拆表
create table myorder(
order_id int primary key,
product_id int,
consumer_id int
);
create table product(
id int primary key,
name varchar (20)
);
create table consumer(
id int primary key,
name varchar (20)
);
满足第二范式
3NF
必须先满足第二范式,除主键列的其他列之间不能有传递依赖的关系。
create table myorder(
order_id int primary key,
product_id int,
consumer_id int,
consumer_phone varchar(15) //此处删掉
);
consumer_phone varchar(15)与consumer_id int有关依赖关系。
所以应该
create table consumer(
id int primary key,
name varchar (20),
consumer_phone varchar(15) //放在这里
);
附加:一处错误
mysql> insert into student2 values(1,'zs','地球');
ERROR 1366 (HY000): Incorrect string value: '\xE5\x9C\xB0\xE7\x90\x83' for column 'address' at row 1
报错不能用中文
解决:
整个修改:
mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)
(此处修改了两个字段可以使用中文name和address)
一个字段一个字段改
mysql> alter table student2 change address address varchar(30) character set utf8;
Query OK, 1 row affected (0.03 sec)
mysql> alter table student2 change name name varchar(20) character set utf8;