生物資訊學中的資料管理/規範化
| 章節導航 | |
| 頂部 | E/R 理論 - 規範化 - 資料查詢 - 整合 SQL 和程式語言 |
| gene_id | name | annotation |
|---|---|---|
| ... | ... | ... |
| g23 | hsp39 | XX 蛋白 |
| g24 | hsp39 | XX 蛋白 |
函式依賴:如果兩個元組在 X 上一致,則它們在 Y 上也一致,則 X->Y。例如“gene_id -> name”和“gid-> annotation”是 FD,但“name->gene_id”和“name->annotation”不是 FD。
鍵和 FD 之間的關係
一組屬性 {A1, A2, ...At} 是關係 R 的鍵,如果
(1) {A1, A2, ...At} 函式確定所有其他屬性;
(2) 當 {A1, A2, ...At} 的任何真子集都不能函式確定所有其他屬性時,它被稱為超鍵(或候選鍵?)。
FD 規則
觀察
Correct:
X->Y, A->B: XA->BY;
X->AY: X->A, X->Y;
X->Y, A->Y: XA->Y;
Incorrect:
XY->A: X->A, Y->A;
函式依賴的形式推理規則
Armstrong’s axioms:
1. Reflexivity: If Y ⊆ X then X -> Y (called trivial FD);
2. Transitivity: If X -> Y and Y -> Z then X -> Z;
3. Augmentation: If X -> Y then XZ -> YZ where Z is a set of attributes.
FD 來自哪裡?
檢視
(1) Domain Knowledge (the meaning of the attributes);
(2) the data;
| a | b | c |
|---|---|---|
| 1 | 2 | 3 |
| 4 | 2 | 6 |
b->a 不是 FD,但 a->b 是一個有效的 FD。
分解表的正式方法
| 基因 | name | annotation | 實驗 ID | 實驗描述 | 實驗級別 |
|---|---|---|---|---|---|
| ... | ... | ... | ... | ... | ... |
⇒
R1 (gid, name, annotation); gid->name annotation;
R2 (exp id, exp desc); exp id -> exp desc;
R3 (gid, expid, exp level); gid, expid -> exp level;
如果對於所有依賴關係 X -> Y,以下至少一個成立,則關係 R 處於 BCNF 中
• X -> Y 是一個平凡的 FD (Y ⊆ X)
• X 是 R 的超鍵
正式定義:如果對於 F+ 中的所有依賴關係 X® Y,以下至少一個成立,則關係 R 處於 3NF 中
• X -> Y 是一個平凡的 FD (Y ⊆ X)
• X 是 R 的超鍵
• Y ⊂ R 的候選鍵
| 移除 冗餘 |
保留 FD |
無損 分解 | |
|---|---|---|---|
| BCNF | 是 | 否 | 是 |
| 3NF | 否 | 是 | 是 |
假設我們有一個類似於以下表的表。
| a | b | c |
|---|---|---|
| 1 | 2 | 3 |
| 4 | 2 | 6 |
分解成以下“規範化”表
|
|
這意味著我們遵循
- b → a 或
- b → c
作為我們分解原始表的 FD。(記住,BCNF 將 X → Y 分解為集合 {X, Y} 和 {除了 Y 的所有內容})。但是,請注意,列 b 具有非唯一值(兩個數字 2)。當我們透過連線重新組合這兩個表時,我們最終得到了一個表,其中原始關係丟失了
| a | b | c |
|---|---|---|
| 1 | 2 | 3 |
| 1 | 2 | 6 |
| 4 | 2 | 3 |
| 4 | 2 | 6 |
我們將其宣告為 **有損分解**,因為分解表假設的 FD 不成立(b → a 和 b → c 均為假)。因此,BCNF 無法消除所有形式的冗餘。我們需要使用另一種模型,多值依賴 (MD),來幫助我們正確分解表以進行規範化。
讓我們探索一個具體的場景。我們想代表富裕學生的財產。我們建立了 **多值依賴 (MD)**
- SID →→ car
讀作,“給定的學生 ID 可以擁有多輛汽車”。
將其與類似於 FD 的內容進行比較
- SID → name
我們將其讀作,“給定的 SID 最多可以有一個姓名”。
假設我們還有以下 MD
- SID →→ clothes
我們可以得到以下表格
| SID | car | clothes |
|---|---|---|
| 1 | 本田 | 牛仔褲 |
| 1 | 豐田 | 卡其褲 |
| 1 | 豐田 | 牛仔褲 |
| 1 | 本田 | 卡其褲 |
| … | … | … |
也許我們想進一步分解這個表。我們沿著 MD 分解
- SID →→ car
這將留下 {SID, clothes},留下以下表格
| SID →→ car | {SID, clothes} | ||||||||||||||||
|
|
我們無法 *真正* 執行此操作,因為這些 *不是* FD!SID →→ car 或 SID →→ clothes 都沒有超鍵。鍵必須是所有三個屬性。我們需要新的規則來分解 MD。
如果 X ∪ Y = {所有屬性} ,則我們稱 MD X →→ Y 在 R 中是平凡的。
例如,考慮以下關係 R1,其中我們有 MD a →→ b
| R1 | |
| a | b |
|---|---|
| 1 | 2 |
| 1 | 3 |
| 2 | 2 |
| … | … |
因為每個 a 可以有多個 b,所以我們無法生成資料來違反 MD。
現在考慮以下關係 R2
| R3 | ||
| a | b | c |
|---|---|---|
| 1 | 2 | 6 |
| 1 | 3 | 7 |
| 2 | 2 | 6 |
| … | … | … |
在這種情況下,a →→ b 是非平凡的,因為關係是三向的。
事實上,a →→ b 有一個也是非平凡的夥伴 MD:a →→ c
以下是 R2 中所有非平凡 MD 對的列表
| ||
| ||
|
將此與 R2 中平凡 MD 的示例進行比較
| a →→ bc |
| ab →→ c |
| b →→ ac |
| bc →→ a |
| c →→ ab |
| ca →→ b |
| … |
在 FD 中,我們知道
然而,同樣的蘊涵對 MD 不存在。也就是說,
給定MD
- a →→ b
- 以及
- a →→ c
我們知道,對於每個 a
- 可以有多個 a
- 可以有多個 a
- 並且,b 與 c 相對於 a 是獨立的,我們用符號表示為 [注意:實際的第一個二元關係符號應該是\Perp而不是\perp,但此符號不受Mediawiki支援。]
根據定義,X → Y ⇒ X →→ Y。如果 X 最多有一個 Y,則它滿足有多個 Y 的條件。
例如,給定以下關係
| a | b |
|---|---|
| … | … |
以及 a → b 的 FD,那麼我們也有 a →→ b 的平凡 MD。
現在,考慮 FD a → b 與以下關係
| a | b | c | d |
|---|---|---|---|
| … | … | … | … |
在這種情況下,我們實際上有兩個非平凡的 MD
| a →→ b |
| a →→ cd |
(記住,非平凡的 MD 成對出現。)