mysql筆記三 數據表三大設計範式

數據表三大設計範式

第一範式

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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章