資料庫複習——資料庫模式設計

来源:https://www.cnblogs.com/Lbmttw/archive/2023/06/13/17375689.html
-Advertisement-
Play Games

# 資料庫模式設計如果不好會導致的問題: 1.冗餘 2.導致數據一致性出現問題 3.插入異常 4.更新異常 5.刪除異常 # 函數依賴 函數依賴是指一個或多個屬性的取值可以確定另一個屬性的取值。具體地說,如果一個關係模式R中屬性集合X的取值能唯一地確定屬性集合Y的取值,那麼我們稱屬性集合Y對於屬性集 ...


資料庫模式設計如果不好會導致的問題:

  1.冗餘

  2.導致數據一致性出現問題

  3.插入異常

  4.更新異常

  5.刪除異常

函數依賴

  函數依賴是指一個或多個屬性的取值可以確定另一個屬性的取值。具體地說,如果一個關係模式R中屬性集合X的取值能唯一地確定屬性集合Y的取值,那麼我們稱屬性集合Y對於屬性集合X具有函數依賴。這被表示為X → Y,其中X稱為函數依賴的左部,Y稱為右部。

  例如,考慮一個包含學生信息的關係模式R,其中包含屬性集合{學生ID,姓名,年齡,所在班級,班級導師}。假設我們觀察到一個學生ID只對應一個姓名和年齡,那麼我們可以說“學生ID函數依賴於姓名和年齡”,表示為{學生ID} → {姓名,年齡}。

  函數依賴在資料庫設計中非常重要,因為它們可以幫助我們識別重覆數據和設計表結構。如果我們正確地理解和應用函數依賴,就可以減少數據冗餘,提高數據完整性和一致性。

資料庫的鍵

 
  在關係型資料庫中,鍵(key)是指一種特殊的屬性或屬性集合,用於唯一標識一個關係中的元組。鍵可以幫助我們在資料庫中快速準確地定位、訪問和修改數據。

關係資料庫中的鍵可以分為以下三種類型:

  1. 主鍵(Primary Key):主鍵是一個關係中的一個或多個屬性,用於唯一標識關係中的每個元組。主鍵具有以下特點:

    • 主鍵的值在關係中必須是唯一的。
    • 主鍵的值不能為空值(NULL)。
    • 一個關係只能有一個主鍵。
  2. 外鍵(Foreign Key):外鍵是一個關係中的屬性,它引用了另一個關係的主鍵,用於建立兩個關係之間的關係。外鍵具有以下特點:

    • 外鍵的值必須在另一個關係中存在,或者為空值(NULL)。
    • 一個關係可以有多個外鍵。
  3. 候選鍵(Candidate Key):候選鍵是一個關係中的一個或多個屬性,它可以唯一標識關係中的每個元組,但不是主鍵。一個關係可以有多個候選鍵。而且不同候選鍵的元素個數可能不同!

  4. 超鍵(super key)是指可以唯一標識一個關係中的每個元組的屬性集合。換句話說,一個超鍵的值集合可以唯一確定關係中每個元組的值。超鍵可以包含關係中的所有屬性,也可以只包含部分屬性。超鍵不一定是最小的,也就是說,可能存在多個超鍵可以唯一標識關係中的每個元組。

  鍵在資料庫中非常重要,因為它們可以幫助我們維護數據的完整性和一致性。通過使用鍵,我們可以確保每個元組都具有唯一的標識符,從而避免數據冗餘和不一致性。

尋找資料庫的鍵

  函數依賴集合的閉包

  定義:在關係資料庫中,函數集合的閉包是指一個函數集合中所有可能的函數依賴組合所得到的函數依賴集合。換句話說,函數集合的閉包包含了原函數集合中所有可能的函數依賴和派生函數依賴。通過尋找函數集合的閉包,我們可以瞭解關係模式中所有可能的函數依賴,從而更好地設計和優化關係模式。

  以下是尋找函數集合的閉包的方法:

  1. 初始閉包:將原函數集合中的所有函數依賴加入到閉包中。

  2. 遞歸添加:對於閉包中的每個函數依賴,找到其右部屬性集合所能推導出的所有函數依賴,並將其添加到閉包中。

  3. 直到無法添加:重覆步驟2,直到閉包中沒有新的函數依賴可以添加為止。

  函數依賴的規則包括以下幾條:

  1. 自反性規則:如果Y包含於X,則X → Y。

  2. 擴展性規則:如果X → Y,那麼XZ → YZ,其中Z是關係R中除X、Y之外的任意屬性集合。

  3. 傳遞性規則:如果X → Y,Y → Z,那麼X → Z。

  這些規則可以用來推導出函數依賴的閉包。通過這些規則,我們可以確定關係模式中的主鍵、候選鍵和冗餘屬性,從而優化關係模式的設計和性能。
 

  通過函數依賴的閉包求解鍵的辦法(暴力法):

  1. 確定關係中的屬性集合:首先,確定關係中的所有屬性集合,包括主屬性和非主屬性。

  2. 確定函數依賴集合:根據實際情況,確定關係中的所有可能函數依賴。一個函數依賴是指一個屬性集合能夠唯一確定另一個屬性集合。例如,如果屬性集合A能夠唯一確定屬性集合B,則稱為A → B。

  3. 計算函數依賴的閉包:通過使用函數依賴的自反性、擴展性和傳遞性規則,計算關係中所有可能的函數依賴。這將給出一個包含原函數依賴和派生函數依賴的函數依賴集合,即函數依賴的閉包。

  4. 確定候選鍵:對於關係中的每個屬性集合,檢查是否可以唯一確定每個元組。如果可以,則該屬性集合是一個候選鍵。如果有多個候選鍵,則需要確定一個主鍵。

  5. 檢查主鍵是否在函數依賴閉包中:檢查所選的主鍵是否在函數依賴閉包中。如果主鍵不在閉包中,則需要重新選擇一個候選鍵作為主鍵。

  啟髮式演算法:

  1. 不在任何函數依賴右邊出現的屬性必然是鍵的一部分。

  2. 不在函數依賴左邊出現的屬性一定不是鍵的一部分

關係模式的分解

  1. 無損分解(Lossless Decomposition)

    無損分解是指將一個大的關係模式拆分成多個小的關係模式,同時保持它們之間的函數依賴和信息完整性不變。這種分解方式的優點是可以提高資料庫的性能和可維護性,同時保持數據的完整性和一致性。無損分解的目標是保證原始關係模式中的所有函數依賴都能在新的小的關係模式中得到滿足,因此無損分解的結果仍然可以保持關係模式的完整性和一致性。

  2. 有損分解(Lossy Decomposition)

    有損分解是指將一個大的關係模式拆分成多個小的關係模式,但不能保持它們之間的函數依賴和信息完整性不變。這種分解方式的優點是可以提高資料庫的性能和可維護性,同時減少數據的冗餘和複雜性。有損分解的目標是在滿足一定的性能需求的前提下,儘可能地減少數據冗餘和複雜性。有損分解的結果可能會導致數據的不一致性和丟失一些信息,因此需要謹慎選擇分解方式和對數據進行適當的處理。

    需要註意的是,無損分解和有損分解都有其適用的場景和限制,具體的選擇需要根據實際需求和性能要求進行綜合考慮。在分解關係R時,我們希望分解能夠:

    • 最小化冗餘

    • 避免信息丟失

    • 保留依賴關係(即約束條件)

    • 確保查詢性能良好

如何將一個模式分解為多個模式

當我們要將一個關係模式拆分為符合第一範式的多個關係模式時,需要遵循以下規則:
  1. 確定主鍵:首先需要確定關係模式的主鍵,以確保每個元組都能唯一標識。主鍵可以由單個屬性或多個屬性組成。

  2. 消除重覆組:如果關係模式中存在重覆組,即有兩個或多個元組在所有屬性上的取值都相同,就需要將這些元組合併為一個元組。

  3. 拆分多值依賴:如果關係模式中存在多值依賴,即一個屬性依賴於主鍵的某個子集而不是整個主鍵,就需要將這些屬性拆分成新的關係模式,並與原來的關係模式建立外鍵關係。

  4. 拆分部分依賴:如果關係模式中存在部分依賴,即一個非主屬性依賴於主鍵的某個子集而不是整個主鍵,就需要將這些非主屬性與主鍵組成一個新的關係模式,併在新的關係模式中建立外鍵關係。

example

例如,假設我們有一個包含以下屬性的關係模式:

學生(學號,姓名,年齡,課程,成績)   

在這個關係模式中,學號是主鍵,課程和成績是非主屬性。由於一個學生可以選修多門課程,課程和成績之間存在多值依賴關係。為了消除多值依賴,我們可以將課程和成績拆分成新的關係模式,並與原來的關係模式建立外鍵關係。這樣就可以得到以下兩個關係模式:

學生(學號,姓名,年齡)

選課(學號,課程,成績)

在新的關係模式中,每個關係模式都符合第一範式的要求,因為每個屬性都是單值屬性,不存在重覆組和多值依賴的問題。

關係模式的範式

在關係型資料庫中,範式(Normalization)是一種通過分解關係模式來減少數據冗餘、提高數據一致性和數據可維護性的技術。範式分為不同的級別,從第一範式(1NF)到第五範式(5NF),每個級別都有其特定的規則和限制。以下是各個範式的詳細說明:
  1. 第一範式(1NF)

    第一範式要求一個關係模式中的每個屬性都是原子的,即不能再分解成更小的數據項。例如,如果一個學生的電話號碼是“123-456-7890”,則應將其分解成三個不同的屬性:國家代碼、區號和電話號碼。

  2. 第二範式(2NF)

    第二範式要求一個關係模式中的每個非主屬性都完全依賴於候選碼,而不是部分依賴於候選碼。例如,如果一個關係模式中包含“訂單號”、“商品編號”和“商品數量”這三個屬性,其中“商品數量”只依賴於“訂單號”,而不依賴於“商品編號”,則應將其拆分為兩個關係模式,以確保每個非主屬性完全依賴於主鍵。

  3. 第三範式(3NF)

    第三範式要求一個關係模式中的每個非主屬性都不依賴於其他非主屬性,即不存在傳遞依賴關係。例如,如果一個關係模式中包含“訂單號”、“商品編號”、“商品名稱”和“供應商名稱”這四個屬性,其中“供應商名稱”依賴於“商品編號”,而“商品名稱”和“供應商名稱”存在函數依賴關係,則應將其拆分為兩個關係模式,以確保不存在傳遞依賴關係。

    一個模式違反第三範式:是A->B當且僅當A不是超鍵且B不是主屬性

  4. 巴斯-科德範式(BCNF)

    巴斯-科德範式是第三範式的擴展,要求一個關係模式中的每個屬性都完全依賴於主鍵,而不是僅依賴於部分主鍵。這種範式適用於複雜的關係模式,其中存在多個主鍵。

  5. 第四範式(4NF)

    第四範式要求一個關係模式中的每個多值依賴都被分解成獨立的關係模式。例如,如果一個關係模式中包含“學生編號”、“課程編號”和“成績”這三個屬性,其中每個學生可能有多個課程的成績,而每個課程可能由多個學生選修,則應將其拆分為三個關係模式,以確保每個多值依賴都被分解成獨立的關係模式。

  6. 第五範式(5NF)

    第五範式是指一個關係模式中的每個依賴關係都是基於超鍵而不是基於主鍵的。超鍵是指能夠唯一標識一個關係模式中所有元組的一個或多個屬性組合。第五範式適用於多維關係資料庫和數據倉庫,其中存在複雜的多重關係和多個維度。

    需要註意的是,雖然範式可以提高資料庫的性能和可維護性,但過度範式化也可能會導致查詢性能下降和數據更新的困難。因此,在實際應用中,需要根據實際需求和性能要求來選擇適當的範式級別,以實現數據的高效管理和使用。

與範式結合的分解

已知關係模式和函數依賴集合保持FD和無損連接3NF模式分解的演算法如下:

  1. 極小函數依賴集Sm和關係模式的所有鍵(keys)。

  2. 在Smin中按函數依賴左部相同原則進行分組,每個組中的所有屬性形成分解後的子關係模式R1, R2, ..., Rn。

  3. 如果某個關係模式Ri的所有屬性被另一個關係模式Rj所包含,刪除關係模式Ri。

  4. 判斷是否有某個key出現在其中的一個關係模式中,如果出現則結束;如果沒有出現,將任意一個key也作為子關係模式R加入到分解後的模式中。

最小函數依賴集

如果函數依賴集合F滿足如下條件,則稱F為一個極小函數依賴集,也稱為最小依賴集或最小覆蓋:

  1. F中的任意函數依賴的右部僅含有一個屬性。

  2. F中不存在這樣的函數依賴X→A使得F與F-X→A等價。

  3. F中不存在這樣的函數依賴X→A,X有真子集Z使得(F-X→A)∪(Z→A)與F等價。

如果G+ = F+,就稱F與G等價。G = F的充分必要條件是F ⊆ G+ 且 G+ ⊆ F。

我們在求最小函數依賴集合時,事實上是將所有右邊僅有一個屬性的函數依賴的冗餘消除掉,包括但不限於具有將具有傳遞性的幾個函數依賴消除掉。最本質仍然是消除冗餘

一個性質:任意一個資料庫的關係模式都可以保持函數依賴和無損鏈接到分解到第三範式!

第四範式

第四範式(4NF)是關係資料庫中的一種規範化形式,它要求關係模式中的每個非平凡多值依賴都要被分解,以達到消除冗餘和保證數據一致性的目的。

具體來說,第四範式的要求如下:

  1. 關係模式中的每個非主屬性必須與主鍵存在非平凡多值依賴,即非主屬性不能完全依賴於主鍵中的任意一個屬性。

  2. 關係模式中的每個非主屬性必須是一個數據項的集合,即不能包含重覆值。

滿足第四範式的關係模式可以消除非平凡多值依賴,避免數據冗餘和更新異常,並且可以保證數據一致性。但是,第四範式的實現可能會導致關係模式的分解過於複雜,查詢性能下降等問題,因此在實際應用中需要根據具體情況綜合考慮。

多值依賴

多值依賴(Multivalued Dependency,MVD)是指一個關係模式中的某些屬性集合對另一個屬性集合存在依賴關係,但是這種依賴關係並不是函數依賴。在一個滿足MVD的關係模式中,一個屬性集合的取值可以對應多個其他屬性集合的取值。

例如,假設我們有一個包含以下屬性的關係模式:

學生(學號,姓名,選修課程,成績)

在這個關係模式中,選修課程和成績之間存在MVD,因為每個學生可以選修多門課程,每門課程的成績都可能不同。因此,選修課程的取值可以對應多個成績的取值,而不是像函數依賴那樣只對應一個成績的取值。

MVD是關係資料庫理論中一個重要的概念,可以幫助我們理解資料庫設計和優化的一些問題。在實際應用中,如果一個關係模式中存在MVD,我們可以考慮將其拆分為符合第三範式或BCNF的多個關係模式,以提高資料庫的性能和可維護性。

下麵將對於多值依賴舉一個例子:

假設有一個關係模式R,包含屬性A、B和C,其中屬性A為主鍵。現在,我們發現存在這樣的依賴關係:對於任意的兩個元組r1和r2,如果它們在A屬性上的值相等,那麼在B屬性和C屬性上的值都是多值依賴的。這就是一個MVD,可以表示為A →→ B,C。

舉個例子,假設關係模式R中有如下數據:

A B C
a1 b1, c1 b2, c2
a1 b2, c2 b1, c1
a2 b3, c3 b4, c4
a2 b4, c4 b3, c3

我們可以看到,在A屬性上有兩個不同的值a1和a2,對於每個值,B和C屬性上的值都是多值依賴的,即b1和b2、c1和c2,以及b3和b4、c3和c4。這就是一個MVD的例子。

需要註意的是,MVD不同於函數依賴,它是對於關係模式中的一組屬性來說的,並且MVD的右側可以包含多個屬性,表示這些屬性的組合是多值依賴的。MVD的出現可能導致數據冗餘和更新異常,需要進行適當的規範化處理。

函數依賴和多值依賴的關係

結論:每個函數依賴都可以看作是一個多值依賴。具體來說,如果一個屬性集合X決定了另一個屬性集合Y,那麼對於所有在屬性集合X上取值相同的元組,它們在屬性集合Y上的取值也必須相同。換句話說,如果我們交換在屬性集合Y上的兩個值,那麼這些元組仍然是合法的。因此,可以將X和Y看作是一個MVD。

具體來說,它指出,如果一個FD X -> Y成立,那麼對於在屬性集合X上取值相同的任意兩個元組,它們在屬性集合Y上的取值必須相同。因此,交換在屬性集合Y上的兩個值不會改變這些元組的合法性。因此,我們可以將FD X -> Y視為MVD X - Y。

補集原理:如果一個屬性集合X決定了另一個屬性集合Y,那麼對於屬性集合Y的補集(即所有不在Y中的屬性集合Z),X和Z之間必須存在MVD。這個原理是很有用的,因為它可以幫助我們從一個給定的函數依賴集合中推導出所有的MVD。具體來說,對於每個函數依賴X -> Y,我們可以通過補集原理推導出所有的MVD X - Z,其中Z是Y的補集。

important:對於多值依賴,如果AB->->C,那麼我們無法推出A->->C且B->->C!對於A->->BC,也無法推出A->->B和A->->C!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## Core Dump 是什麼? Core Dump 是指進程異常退出時,操作系統將進程的記憶體狀態保存到文件中,這個文件就是 Core Dump 文件,中文一般翻譯為“核心轉儲”,哈,看起來還不如不翻譯。 我們可以認為 Core Dump 是“記憶體快照”,但實際上,除了記憶體信息之外,還有些關鍵的程 ...
  • CS5366內部集成了PD3.0及DSC decoder,應用Type-C轉HDMI2.0的顯示協議轉換晶元, 簡介: CS5366系列提供了USB Type-C(DisplayPort Alternate Mode)到HDMI轉換器的單晶元解決方案,帶有電源傳輸。CS5366系列支持一個USB T ...
  • 參考帖子:https://blog.csdn.net/freedompoi/article/details/122350866 目前想要實現STM32F4自帶的DMA雙緩衝區,嘗試過一版,結果不能預期,就使用了RxHalfCplt和RxCplt去實現DMA雙緩衝區的效果。 現在有時間了,又重新實現S ...
  • ## 介紹 windows系統自帶的遠程桌面連接相對市面上其他的遠程軟體而言有他的優點: 1. 免費 2. 連接穩定 3. 操作流暢,幾乎沒有遠程辦公的卡滯感 但是,唯一的缺點是連接的電腦之間必須使用一個區域網,也就是說比較適合校園、企業用戶。以校園為例進行講解。 ## 使用前提 1. 連接及被連接 ...
  • # 文件系統 > 文件是面向OS和麵向使用者而言的,對於人來說,音樂,圖片,文檔,游戲,軟體,郵件,等記錄信息的載體都被操作系統統稱為文件,而存儲在HDD(機械硬碟)和SSD(固態硬碟)里.因此文件是一種實體的抽象,而之所以文件需要文件名,是因為不同的文件需要進行相對應的區分,也就是文件名,而其中的 ...
  • # region Region是HBase數據管理的基本單位,region有一點像關係型數據的分區。 Region中存儲這用戶的真實數據,而為了管理這些數據,HBase使用了RegionSever來管理region。 ## region的分配 一個表中可以包含一個或多個Region。 每個Regio ...
  • 事務隔離級別遺留問題: 在讀已提交的級別下,事務B可以讀到事務A持有寫鎖的的記錄,且讀到的是未更新前的,為何寫讀沒有衝突? 可重覆讀級別,事務B可以更新事務A理論上應該已經獲取讀鎖的記錄,且更新後,事務A依然可以讀到數據,為何讀-寫-讀沒有衝突? 在可重覆讀級別,幻讀沒有產生 其中,前兩個問題就是因 ...
  • 企業數字化轉型以數據為中心,通過數據驅動業務發展、管理協同和運營。因此,數字化轉型關鍵在於數據,數據治理則需先行。從而更好激發數據生產要素潛能,實現業務數據化、數據價值化,助力企業數字化轉型。 ## 那麼何為數據治理? 國際數據管理協會(DAMA)在其《DAMA數據管理知識體系指南(第2版)》一書中 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...