數據表三大設計範式
第一範式
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;