Database-Design

關於規範化性能的問題

  • October 16, 2014

很抱歉,這是一個如此新的問題,但這是我很難整理思緒的一件事,經過一個晚上的閱讀,我終於決定要求澄清一下。

假設我有一個包含有關伺服器資訊的表。隨著新伺服器上線,此表中將填充有關伺服器的資訊。現在,假設伺服器名稱是唯一的,伺服器序列號是唯一的。

場景#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 被迫序列化更新事務,從而產生瓶頸。但是提取和報告通常比在設計良好但未規範化的數據庫上更慢、更麻煩。

如果您決定不規範化,請不要隨意設計,以任何乍一看似乎不錯的方式組合表格。採用除規範化之外的一些設計規範來指導您進行良好的設計。星型模式就是這樣一種替代設計規則。

引用自:https://dba.stackexchange.com/questions/80238