資料庫設計三大正規化和五大約束
【三大正規化】
第一正規化(1NF):
資料表中的每一列(欄位),必須是不可拆分的最小單元,也就是確保每一列的原子性。
例如: userInfo: '山東省煙臺市 1318162008' 依照第一正規化必須拆分成
userInfo: '山東省煙臺市' userTel: '1318162008'兩個欄位
第二正規化(2NF):
滿足1NF後要求表中的所有列,都必需依賴於主鍵,而不能有 任何一列與主鍵沒有關係(一個表只描述一件事情)。
例如:訂單表只能描述訂單相關的資訊,所以所有的欄位都必須與訂單ID相關。
產品表只能描述產品相關的資訊,所以所有的欄位都必須與產品ID相關。
因此在同一張表中不能同時出現訂單資訊與產品資訊。
第三正規化(3NF):滿足2NF後,要求:表中的每一列都要與主鍵直接相關,而不是間接相關(表中的每一列只能依賴於主鍵)
例如:訂單表中需要有客戶相關資訊,在分離出客戶表之後,訂單表中只需要有一個使用者
ID即可,而不能有其他的客戶資訊,因為其他的使用者資訊是直接關聯於使用者ID,而不是關聯
於訂單ID。
【資料庫五大約束】
1.主鍵約束(Primay Key Coustraint) 唯一性,非空性;
2.唯一約束 (Unique Counstraint)唯一性,可以空,但只能有一個;
3.預設約束 (Default Counstraint) 該資料的預設值;
4.外來鍵約束 (Foreign Key Counstraint) 需要建立兩表間的關係;
5.非空約束(Not Null Counstraint):設定非空約束,該欄位不能為空。
五大約束的語法示例:
1. 新增主鍵約束
Alter table 表名 add Constraint 主鍵名 primary key(欄位)
2. 新增唯一約束
Alter table 表名 add Constraint 約束名 unique(欄位)
3. 新增預設約束
Alter table 表名 add Constraint 約束名 default(預設內容) for 欄位名
4. 新增檢查約束
Alter table 表名 add Constraint 約束名 check (欄位表達)
5. 新增外來鍵約束
Alter table 表名 add Constraint 約束名 foreign key(欄位) references 表名(欄位名)
詳細介紹:
(1)[主鍵約束](Primay Key Coustraint)
1.主鍵的注意事項:主鍵預設非空,預設唯一性約束,只有主鍵可以設定自動增長(主鍵不一定自增,自增一定是主鍵)。
2.設定主鍵的方式:
①:在定義列時設定:id INT UNSIGNED PRIMARY KEY。
②:在列定義完成後設定:PRIMARY KEY(id)
(2)[外來鍵約束 (Foreign Key Counstraint) ]
1.設定外來鍵的注意事項:
①:只有INNODB的資料庫引擎支援外來鍵,修改my.ini檔案設定default-storage-engine=INNODB;
②:外來鍵與參照列的資料型別必須相同。(數值型要求長度和無符號都相同,字串要求型別相同,長度可以不同);
③:設定外來鍵的欄位必須要有索引,如果沒有索引,設定外來鍵時會自動生成一個索引;
2.設定外來鍵的語法:
[CONSTRAINT 外來鍵名] FOREIGN KEY(外來鍵欄位) REFERENCES 參照表(參照欄位) [ON DELETE SET NULL ON UPDATE CASCADE] -- 設定操作完整。
3、外來鍵約束的參照操作:
當對參照表的參照欄位進行刪除或更新時,外來鍵表中的外來鍵如何應對。
參照操作可選值:
RESTRICT: 拒絕對參照欄位的刪除或修改(預設);
NO ACTION:與RESTRICT相同,但這個指令只在MySql生效;
CASCADE: 刪除或更新參照表的參照欄位時,外來鍵表的記錄同步刪除或更新;
SET NULL: 刪除刪除或更新參照表的參照欄位時,外來鍵表的外來鍵設為NULL (此時外來鍵不能設定為NOT NULL)。