mysql筆記三 資料表三大設計正規化

2021-10-07 14:52:00 字數 4073 閱讀 8190

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;

MySQL資料表設計,三大正規化

個人筆記,僅供參考 三大正規化即三個建立資料表的準則,根據自己的實際需求決定是否遵守即可 資料表中的所有欄位都是不可分割的原子值 例如乙個位址資訊,如果全部存在乙個欄位中就不符合第一正規化,需要把國家,省份這些資訊盡可能拆分到不同欄位才滿足。這樣可以方便以後檢索。舉例 create table st...

資料表三大設計正規化

第一正規化 inf資料表中所有欄位都是不可分割的原子值 create table student2 id int primary key,name varchar 20 address varchar 30 insert into student2 values 1,li 四川省成都市武侯大道100...

(Mysql 八)資料表設計的三大正規化

目錄 基礎知識 一 第一正規化 每一列都是不可分割的原子資料項 存在問題 二 第二正規化 在第一正規化的基礎上,非碼屬性必須完全依賴於碼 三 第三正規化 在第二正規化的基礎上,消除傳遞依賴 四 表與表之間的對應關係 1.多對一 2.多對多 設計資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,...