一對多(或多對一)
多對多設計關聯式資料庫時,需要遵循的一些規範。要遵循後邊的正規化要求,必須先遵循前邊的所有正規化要求。
遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。
目前關聯式資料庫有六種正規化:第一正規化(1nf)、第二正規化(2nf)、第三正規化(3nf)、巴斯-科德正規化(bcnf)、第四正規化(4nf)和第五正規化(5nf,又稱完美正規化)。
這裡簡述基本的三正規化:
1. 第一正規化(1nf):每一列都是不可分割的原子資料項;
2. 第二正規化(2nf):在1nf的基礎上,非碼屬性必須完全依賴於碼(消除非主屬性對主碼的部分函式依賴);
* 幾個概念:
* 函式依賴:a-->b,如果通過a屬性(屬性組)的值,可以確定唯一b屬性的值,則稱b依賴於a。
例如:學號-->姓名。 (學號,課程名稱) --> 分數
* 完全函式依賴:a-->b, 如果a是乙個屬性組,則b屬性值得確定需要依賴於a屬性組中所有的屬性值。
例如:(學號,課程名稱) --> 分數
* 部分函式依賴:a-->b, 如果a是乙個屬性組,則b屬性值得確定只需要依賴於a屬性組中某一些值即可。
例如:(學號,課程名稱) --> 姓名
* 傳遞函式依賴:a-->b, b -->c . 如果通過a屬性(屬性組)的值,可以確定唯一b屬性的值,
再通過b屬性(屬性組)的值可以確定唯一c屬性的值,則稱 c 傳遞函式依賴於a。
例如:學號-->系名,系名-->系主任
* 碼:如果在一張表中,乙個屬性或屬性組,被其他所有屬性所完全依賴,則稱這個屬性(屬性組)為該錶的碼
例如:該表中碼為:(學號,課程名稱)
* 主屬性:碼屬性組中的所有屬性
* 非主屬性:除過碼屬性組的屬性
3. 第三正規化(3nf):在2nf基礎上,任何非主屬性不依賴於其它非主屬性(消除傳遞依賴)。
對錶中的資料進行限定,保證資料的正確性、有效性和完整性。
1. 注意:
* 含義:非空且唯一
* 一張表只能有乙個字段為主鍵
* 主鍵就是表中記錄的唯一標識
2. 在建立表時,新增主鍵約束
create table stu(
id int primary key, //給id新增主鍵約束
name varchar(20)
);3. 刪除主鍵
alter table stu drop primary key;
4. 建立完錶後,新增主鍵
alter table stu modify id int primary key;
5. 自動增長:
* 概念:如果某一列是數值型別的,使用 auto_increment 可以來完成值得自動增長
* 在建立表時,新增主鍵約束,並且完成主鍵自增長
create table stu(
id int primary key auto_increment, //給id新增主鍵約束
name varchar(20)
);* 刪除自動增長
alter table stu modify id int;
* 新增自動增長
alter table stu modify id int auto_increment;
1. 建立表時新增約束
create table stu(
id int,
name varchar(20) not null //name為非空
);2. 建立表完後,新增非空約束
alter table stu modify name varchar(20) not null;
3. 刪除name的非空約束
alter table stu modify name varchar(20);
1. 建立表時,新增唯一約束
create table stu(
id int,
phone_number varchar(20) unique //新增了唯一約束
);* 注意mysql中,唯一約束限定的列的值可以有多個null
2. 在建立表後,新增唯一約束
alter table stu modify phone_number varchar(20) unique;
3. 刪除唯一約束
alter table stu drop index phone_number;
1. 在建立表時,可以新增外來鍵
* 語法:
create table 表名(
....
外來鍵列, //外鍵值可以為null
constraint 外來鍵名稱 foreign key (外來鍵列名稱) references 主表名稱(主表列名稱) //constraint約束
);2. 刪除外來鍵
alter table 表名 drop foreign key 外來鍵名稱;
3. 建立表之後,新增外來鍵
alter table 表名 add constraint 外來鍵名稱 foreign key (外來鍵列名) references 主表名稱(主表列名稱);
4. 級聯操作
* 新增級聯操作
語法:* 分類:
1. 級聯更新:on update cascade
2. 級聯刪除:on delete cascade
可以通過命令列方式或者圖形化工具進行資料庫的備份和還原
* 語法:
* 備份: mysqldump -u使用者名稱 -p密碼 資料庫名稱 > 儲存的路徑
* 還原:
1. 登入資料庫
2. 建立資料庫 create database 資料庫名稱;
3. 使用資料庫 use 資料庫名稱;
4. 執行檔案 source 檔案路徑;
* 備份:
* 還原:
mysql設計技巧 MySQL庫表設計小技巧
前言 在我們專案開發中,資料庫及表的設計可以說是非常重要,我遇到過很多庫表設計比較雜亂的專案,像表名 欄位名命名混亂 字段型別設計混亂等等,此類資料庫後續極難維護與拓展。我一直相信只有優秀的庫表設計才能發揮出mysql最大的效能,前面有篇文章也分享了資料庫的使用規範,本篇文章主要講幾個庫表設計的小技...
MySQL 資料庫表設計
字段具有原子性,不可再分。所有關係型資料庫系統都滿足第一正規化 資料庫表中的字段都是單一屬性的,不可再分 要求實體的屬性完全依賴於主鍵。所謂完全依賴是指不能存在僅依賴主鍵一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成乙個新的實體,新實體與原實體之間是一對多的關係。為實現區分...
mysql設計表月份 mysql,表設計
閒著沒事搞了一下,歡迎指教。使用者表 create table usr uid int 11 not null,name char 10 default null,primary key uid engine innodb default charset utf8 吃飯記錄表 create tabl...