資料庫基礎之正規化和約束介紹

2021-12-30 11:17:21 字數 3105 閱讀 8334

一.資料庫中的正規化:

正規化, 英文名稱是 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 唯一性約束用來限制不受主鍵約束的列上...