關於規範化性能的問題
很抱歉,這是一個如此新的問題,但這是我很難整理思緒的一件事,經過一個晚上的閱讀,我終於決定要求澄清一下。
假設我有一個包含有關伺服器資訊的表。隨著新伺服器上線,此表中將填充有關伺服器的資訊。現在,假設伺服器名稱是唯一的,伺服器序列號是唯一的。
場景#1:
伺服器表
server_name 文本,
server_serial 文本,
server_os integer(FK 指向 os 表),
os_version integer(FK 指向 os_version 表),cpu_type integer(FK 指向 cpu_type 表
),
現在,讓我們假設有 20 個關於此伺服器的東西不是唯一的(例如,server_os 不是唯一的),因此在場景 #1 中,我們有 20 個包含指向其他表的 PK 的 FK 的列。
場景#2:
沒有標準化。沒有其他表,只是一個伺服器表,其中包含與伺服器相關的所有列。沒有 FK/PK 關係。
通常我會選擇場景#1。但是,在場景 #1 中,我最終會遇到更多查詢。對於場景 #2,我只需為每個伺服器插入一個。在場景 #1 中,我需要進行選擇以獲取所有 20 列的 PK,然後使用返回的值進行插入(假設所有值都存在於 20 個其他列中,21 個查詢)。如果有新的 server_os、cpu_type 等,情況會更糟。
任何幫助理解為什麼場景#1(標準化)在這種情況下更好,將不勝感激,或者我在這裡缺少什麼。謝謝!
標準化和性能之間的關係是複雜的。追求規範化和追求高性能有時是同向的,有時是相反的。您必須仔細查看每個案例。
更重要的是,數據庫中有不止一種“好”的衡量標準。除了性能之外,還有易於程式、易於理解、面對不斷變化的需求的適應性等等。
學習如何規範化只是開始。除了學習基本範式(1NF、2NF、3NF、BCNF、4NF、5NF)之外,您還應該了解不符合這些範式的好處。一般來說,符合 1NF 可以讓您獲得對所有數據的密鑰訪問。符合 2NF 到 5NF 可以讓您免於有害的冗餘。一旦你知道了好處,你就可以將它們與成本進行比較。
包含有害冗餘的數據庫可能會通過將相互矛盾的謂詞儲存在兩個不同的位置來使數據庫自相矛盾。您可以通過在編寫應用程序時非常小心來避免自相矛盾。但通常最好以不會自相矛盾的方式設計數據庫,而規範化在這裡會有所幫助。
規範化有時有助於數據庫在更新時避免“熱點”,在這種情況下,DBMS 被迫序列化更新事務,從而產生瓶頸。但是提取和報告通常比在設計良好但未規範化的數據庫上更慢、更麻煩。
如果您決定不規範化,請不要隨意設計,以任何乍一看似乎不錯的方式組合表格。採用除規範化之外的一些設計規範來指導您進行良好的設計。星型模式就是這樣一種替代設計規則。