一.資料庫中的正規化:
正規化, 英文名稱是 normal form,它是英國人 e.f.codd(關聯式資料庫的老祖宗)在上個世紀70年代提出關聯式資料庫模型後總結出來的,正規化是關聯式資料庫理論的基礎,也是我們在設計資料庫結構過程中所要遵循的規則和指導方法,以下就是對這三個正規化的基本介紹:
第一正規化(1nf)
資料表中的每一列(字段),必須是不可拆分的最小單元,也就是確保每一列的原子性。
簡而言之,第一正規化就是無重複的列。例如,由「職工號」「姓名」「**號碼」組成的表(乙個人可能有一部辦公**和一部移動**),這時將其規範化為1nf可以將**號碼分為「辦公**」和「移動**」兩個屬性,即職工(職工號,姓名,辦公**,移動**)。
第二正規化(2nf):
滿足1nf後要求表中的所有列,都必需依賴於主鍵,而不能有 任何一列與主鍵沒有關係(乙個表只描述一件事情)。
例如:訂單表只能描述訂單相關的資訊,所以所有的字段都必須與訂單id相關。
產品表只能描述產品相關的資訊,所以所有的字段都必須與產品id相關。
因此在同一張表中不能同時出現訂單資訊與產品資訊。
第三正規化(3nf):
滿足2nf後,要求:表中的每一列都要與主鍵直接相關,而不是間接相關(表中的每一列只能依賴於主鍵)
例如:訂單表中需要有客戶相關資訊,在分離出客戶表之後,訂單表中只需要有乙個使用者
id即可,而不能有其他的客戶資訊,因為其他的使用者資訊是直接關聯於使用者id,而不是關聯
於訂單id。
注意事項:
1.第一正規化與第二正規化的本質區別:在於有沒有分出兩張表。
第二正規化是說一張表中包含了多種不同實體的屬性,那麼必須要分成多張表,第三正規化是要求已經分好了多張表的話,一張表中只能有另一張標的id,而不能有其他任何資訊,(其他任何資訊,一律用主鍵在另一張表中查詢)。
2.必須先滿足第一正規化才能滿足第二正規化,必須同時滿足第一第二正規化才能滿足第三正規化。
4、bcnf(bc正規化):第三正規化的擴充套件和加強
它構建在第三正規化的基礎上,如果關係模型r是第一正規化,且每個屬性都不傳遞依賴於r的候選鍵,那麼稱r為bcnf的模式。
這裡用網上看到的乙個例子:
表結構: 倉庫id 管理員id 物品id 物品數量
其中管理員和倉庫的關係是一對一,倉庫和物品的關係是一對多;
這個設計符合第
一、二、三正規化,即每列不可分割、主鍵唯一且不存在傳遞依賴;
可看到依賴關係有管理員id 依賴倉庫id,物品id 依賴倉庫id。 即存在主鍵到主鍵再到非主鍵的傳遞依賴關係。
這裡的主要問題是,倉庫id和管理員id這兩個關鍵字段之間的關係被耦合到每乙個例項中了,這導致:
a) 表中沒有資料的時候,無法描述倉庫和管理員之間的關係
b) 乙個倉庫的管理員替換後,表中所有含有該倉庫的例項中的管理員id都要被修改
解決辦法是將二者的關係提出來單獨建表。
則原表結構改為:倉庫id 物品id 物品數量
增加表的結構:倉庫id 管理員id
這樣倉庫和管理員的關係 及 倉庫和物品的關係 就解耦合了。
存在關鍵字段決定關鍵字段的情況,因此其不符合bcnf。把倉庫管理關係表分解為兩個關係表倉庫管理表(倉庫號,管理員號)和倉庫表(倉庫號,儲存物品號,數量),這樣這個資料庫表是符合bcnf的,並消除了刪除異常、插入異常和更新異常。
5、4nf(第四正規化)
設r是乙個關係模型,d是r上的多值依賴集合。如果d中存在凡多值依賴x->y時,x必是r的超鍵,那麼稱r是第四正規化的模式。必須先滿足第三正規化。簡單來說就是將表中的多值屬性拆分出來,分別建表。
例如,職工表(職工編號,職工孩子姓名,職工選修課程),在這個表中,同乙個職工可能會有多個職工孩子姓名,同樣,同乙個職工也可能會有多個職工選修課程,即這裡存在著多值事實,不符合第四正規化。如果要符合第四正規化,只需要將上表分為兩個表,使它們只有乙個多值事實,例如職工表一(職工編號,職工孩子姓名),職工表二(職工編號,職工選修課程),兩個表都只有乙個多值事實,所以符合第四正規化。
二:資料庫中的五大約束:
資料庫中的五大約束包括:
1.主鍵約束(primay key coustraint) 唯一性,非空性;
2.唯一約束 (unique counstraint)唯一性,可以空,但只能有乙個;
3.預設約束 (default counstraint) 該資料的預設值;
4.外來鍵約束 (foreign key counstraint) 需要建立兩表間的關係;
5.非空約束(not nullcounstraint):設定非空約束,該欄位不能為空。
詳細介紹:
(1)[外來鍵約束(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)。
(2)[主鍵約束](primay key coustraint)
1.主鍵的注意事項:主鍵預設非空,預設唯一性約束,只有主鍵可以設定自動增長(主鍵不一定自增,自增一定是主鍵)。
2.設定主鍵的方式:
①:在定義列時設定:id int unsigned primary key。
②:在列定義完成後設定:primary key(id)。
其他約束沒有特殊要求因此不做解釋。
正規化 資料庫表的建立 修改和約束設定
建立表修改表結構 約束constraint 解決資料冗餘的問題 確保每列保持原子性 如果資料庫表中的所有字段值都是不可分解的原子值,就滿足了第一正規化。確保表中的每列都和主鍵相關,而不能只於主鍵的某一部分相關。主要是在聯合主鍵的情況下。每一列都與主鍵直接相關,而不能與主鍵簡介相關。新建表時,指定的表...
mysql資料庫基礎 資料型別和約束
char 固定長度 char 4 as as varchar 可變長度字串 varchar 4 as as text 大文字儲存 字元 4000 1 整數和浮點數如果不需要小數部分,則使用整數來儲存資料,並且根據整數的大小,來選擇合適的整數型別,如果需要小數部分,則使用浮點數型別,浮點數型別中,有f...
關於資料庫的索引和約束
1.主鍵約束 primary key 1 主鍵用於唯一地標識表中的每一條記錄,可以定義一列或多列為主鍵。2 是不可能 或很難 更新 3 主鍵列上沒有任何兩行具有相同值 即重複值 不允許空 null 4 主健可作外健,唯一索引不可 2.唯一性約束 unique 1 唯一性約束用來限制不受主鍵約束的列上...