12/03/2010

資料庫的正規化

正規化說明:
正規化是在資料庫中組織資料的程序。其中包括建立資料表,以及在這些資料表之間根據規則建立關聯性,這些規則的設計目的是:透過刪除重複性和不一致的相依性,保護資料的完整性,使資料在作新增、更新、刪除及查詢時,能夠很有效率及很有效能的運作,並讓資料庫更有彈性。但在實際運用中,並不是徹底的實施正規化,就可以很有效率和很有效能的運作,也不能完全沒有作正規化的步驟,唯有做到恰到好處,才能使系統程式在設計時,能夠方便設計,又不會使資料庫運作的效率和效能降低。

正規化規則說明概述如下:
First normal form (1NF)
Table faithfully represents a relation and has no repeating groups.
(資料表忠實地描述關系,並且不允許有重複群組的出現)
也就是要滿足下列5個條件:
1. There's no top-to-bottom ordering to the rows. 列與列之間沒有上到下的順序關係。
2. There's no left-to-right ordering to the columns.行與行之間沒有左到右的順序關係。
3. There are no duplicate rows. 沒有重複的列 (所以一定要有一個primary key)
4. Every row-and-column intersection contains exactly one value from the applicable domain (and nothing else). 每一筆資料只能有單一值
5. All columns are regular [i.e. rows have no hidden components such as row IDs, object IDs, or hidden timestamps]. 所有的行是正常的資料,不允許有隱藏的元件。

     —Chris Date, "What First Normal Form Really Means", pp. 127-8

接下來第二正規化到第五正規化,利用Foreign key建立master table與child table之間的關係來拆解資料表。
 
Second normal form (2NF)
    滿足1NF 並且
    No non-prime attribute in the table is functionally dependent on a proper subset of a candidate key. (不存在非鍵值的屬性對任一候選鍵的部分功能相依)    

Third normal form (3NF)
    滿足2NF 並且
    Every non-prime attribute is non-transitively dependent on every candidate key in the table. 
    (不存在非鍵值的屬性對任一候選鍵的遞移相依)

Boyce-Codd normal form (BCNF)
    滿足3NF 並且
     Every non-trivial functional dependency in the table is a dependency on a superkey
     (資料表中的任何非平凡(主屬性)的功能相依,都必須是對superkey的相依)

Fourth normal form (4NF)
    滿足BCNF 並且
     Every non-trivial multivalued dependency in the table is a dependency on a superkey
     (資料表中任何非平凡(主屬性)的多重值相依,都是對superkey的相依)

Fifth normal form (5NF)
     滿足4NF 並且
     Every non-trivial join dependency in the table is implied by the superkeys of the table.
     (資料表中任何非平凡(主屬性)的合併相依,都是隱含於superkey)

 Domain/key normal form (DKNF):
     Every constraint on the table is a logical consequence of the table's domain constraints and key constraints
    (資料表上的任何的限制,都要是值域或主鍵限制的邏輯結果)
    (p.s.3NF,BCNF,4NF,5NF 都是DKNF的一個特例)

 Sixth normal form (6NF)
     Table features no non-trivial join dependencies at all (with reference to generalized join operator)
    (資料表特徵沒有任何主屬性的廣義合併相依)
    (Any relation in 6NF is also in 5NF)


補充說明:
Unique key:唯一鍵,在關聯式資料庫中,unique key 可以唯一識別資料表中每一個row,且允許一個column可以有一個null值。
Superkey:超級鍵,如果屬性或屬性組合能唯一識別每一個row,則它是一個superkey。所以unique key 跟 superkey的觀念非常接近,unique key 加上非 unique key 可以構成superkey,但是不能有null值。
Candidate key:候選鍵,當Superkey只包含一個屬性時,則它是一個候選鍵;當Superkey包含一組屬性時,僅當這一組屬性不包含另一Superkey時,它是一個候選鍵。換句話說,候選鍵是“純凈的”、最小化的Superkey。
Primary key:主鍵,在資料表中,只能在candidate key中挑選一個來當作primary key,primary key與unique key的差別在於不允許存在null 值。
Foreign key:外來鍵,在關聯式資料庫中,每個資料表都是由關聯來連繫彼此的關係,主資料表的cloumn或多組column會放在另一個子資料表,而這些column在子資料表必須為primary key 或 candidate key,這個屬性就是外來鍵。
Alternate key(secondary key):替代键,除了被挑選為primary key之外的任一候選鍵就是替代键。

沒有留言: