MySQL數據庫使用筆記(二):範式設計

本筆記來自bilibili:一天學會 MySQL 數據庫
以及參考某位大佬的筆記
MySQL數據庫使用筆記(一):終端使用與約束
MySQL數據庫使用筆記(二):範式設計
MySQL數據庫使用筆記(三):查詢練習
MySQL數據庫使用筆記(四):鏈接查詢與事務

MySQL數據庫使用筆記(二):範式設計

數據庫的三大設計範式

1.第一範式

數據表中的所有字段都是不可分割的原子值
創建表:

create table student2 (
id int primary key,
name varchar(20),
address varchar(30)
);

插入數據:

insert into student2 values(1, '張三', '重慶市沙正街100號');
insert into student2 values(2, '李四', '重慶市沙正街110號');
insert into student2 values(3, '王五', '重慶市沙正街120號');

查看數據: select * from student2;

+----+------+-------------------+
| id | name | address           |
+----+------+-------------------+
|  1 | 張三 | 重慶市沙正街100|
|  2 | 李四 | 重慶市沙正街110|
|  3 | 王五 | 重慶市沙正街120|
+----+------+-------------------+

像這種字段值還可以繼續拆分的,就不滿足第一範式
重新創建表:

create table student3(
id int primary key,
name varchar(20),
cuntry varchar(30),
privence varchar(30),
city varchar(30),
details varchar(30)
);

插入數據:

insert into student3 values(1, '張三','中國', '四川省', '成都市','武侯區武侯大道100號');
insert into student3 values(2, '李四','中國', '四川省', '成都市','武侯區京城大道200號');
insert into student3 values(3, '王五','中國', '四川省', '成都市', '高新區天府大道90號');

查看數據:select * from student3;

+----+------+--------+----------+--------+---------------------+
| id | name | cuntry | privence | city   | details             |
+----+------+--------+----------+--------+---------------------+
|  1 | 張三 | 中國   | 四川省   | 成都市 | 武侯區武侯大道100|
|  2 | 李四 | 中國   | 四川省   | 成都市 | 武侯區京城大道200|
|  3 | 王五 | 中國   | 四川省   | 成都市 | 高新區天府大道90|
+----+------+--------+----------+--------+---------------------+

範式,設計的越詳細,對於某些實際操作可能更好,但是不一定都是好處。

2.第二範式

必須是滿足弟一範式的前提下,第二範式要求,除主鍵外的每一列都必須完全依賴與主鍵。
如果要出現不完全依賴,只可能發生在聯合主鍵的情況下。
比如創建訂單表:

create table myorder(
product_id int,
customer_id int,
product_name varchar(20),
customer_name varchar(20),
primary key( product_id, customer_id)
);

這樣存在問題:除主鍵以外的其他列,只依賴與主鍵的部分字段
product_name 只與product_id有關,customer_name只與customer_id有關。
解決辦法:拆表

create table myorder(
order_id int primary key,
product_id int,
customer_id int
);
create table product(
id int primary key,
name varchar(20)
);
create table customer(
id int primary key,
name varchar (20)
);

分成三個表之後,就滿足了第二範式的設計!

2.第三範式

必須先滿足第二範式,除開主鍵列的其他列之間不能有傳遞依賴關係。
比如創建表:

create table myorder(
order_id int primary key,
product_id int, 
customer_id int,
customer_phone varchar(15)
);

customer_phone其實只與customer_id有關。
所以應該修改爲:

create table myorder(
order_id int primary key,
product_id int,
customer_id int
);
create table customer(
id int primary key,
name varchar(20),
phone varchar(15)
);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章