作為資料庫設計人員,當我們負責資料庫專案時,在資料庫設計以及把資料庫部署到生產環境的過程中可能會遇到一些挑戰。
其中一些問題不可避免,也無法控制。但是,其中相當一部分可以追溯到資料庫設計本身的質量。我們在初步階段所做的決定會對資料庫最終的工作情況有深遠的影響。
如果我們要建一所房子,我們不會聘請一位工程承包商,然後馬上就要求他們開始打地基。這會導致災難發生。至少,我們需要就建房計畫和藍圖達成一致。資料庫設計也一樣。我們規劃得越好,設計的輸出質量就越高。
好的資料庫是深思熟慮的結果,而不是臨時想法的集合。糟糕的設計規劃會導致結構性問題,該資料庫一旦推出後,要解決這些問題是相當昂貴的。我們不可能總是能**到資料庫會遇到的所有問題,但是好的規劃確保我們可以把問題減少到只有那些真正無法避免的問題。
建立資料庫的目的相當廣泛。從儲存個人私人資訊的小型資料庫到處理海量資訊的大規模企業資料庫。設計人員必須明白資料庫的目的所在,以便用最符合這些目標的方式來設計。
要問的關鍵問題包括:資料的性質、資料獲得的方式、資料儲存和檢索的頻率、資料的規模、使用資料的應用程式是什麼。在工作日結束時手動輸入資料的資料庫和實時捕獲並自動儲存資料的複雜的行業資料庫不能用同一種設計模型。
設計的關鍵是確保資料效率、可用性和安全性的(請參考postgresql安全)。忽略資料的目的將導致設計看上去符合所有的條條框框,但實際上是不健全的。
資料庫設計不是乙個嚴格確定的過程。兩個遵循同樣設計規範的開發人員最終可以設計出兩個截然不同的資料庫。這主要是因為任何軟體工程專案都固有的創造性。儘管如此,設計的一些核心原則對確保資料庫以最佳方式執行至關重要。其中之一就是規範化。規範化指的是用於把錶分解成組成部分的技術。我們執行該操作,直到我們讓每一張表只表示一種事物,而列描述該錶所代表的項的屬性。規範化是一種古老的計算概念,已經有30多年的歷史了。事實上,sql主要用於讀取和操作規範化資料集。為了理解規範化,有必要了解sql的工作原理。
sql本質上是一種迭加式語言,適用於輕鬆建立結果集或值集。使用from子句,我們可以從一張表中提取資料,並使用join把資料新增到另一張表的內容中。我們可以使用幾乎無限數量的表來生成我們需要的資料。sql的迭加能力對資料庫開發和效能來說都至關重要。
當索引與鍵值完全同步時,索引效果最佳。當我們必須使用like、charindex、substring及類似命令來解析值與列值的組合時,sql正規化遭到破壞,資料可搜尋性變差。
因此,規範化我們的資料庫對簡化開發和始終如一的高效能至關重要。儘管如此,規範化還是有很多層次的,而且存在過度規範化的資料庫。良好的規範化平衡了記錄插入、更新、查詢和刪除的需求。採用最廣泛的最佳實踐是,資料庫必須至少規範化到第三正規化(third normal form,簡稱3nf)。但是,第四(4nf)和第五(5nf)正規化也相當有用,容易理解,也值得我們努力了解如何使用它們。
冗餘表和字段對資料庫設計人員和管理員來說是噩夢。它們需要占用系統資源才能保持安全、更新和備份。當我們討論十多個記錄時,冗餘記錄也許看起來不多。但是,在大型資料庫中,冗餘字段可以是數千個或數百萬個,計算資源開銷很大。它們不必要地增加了資料庫的規模,降低了效率,增加了資料崩潰的風險。
當然,有時候冗餘也許是必要的,但是,這應該是例外,而不是規則。即使允許冗餘,也應當清楚地記錄理由,以確保將來該理由不再有效時,資料庫管理員可以刪除冗餘。
有時候,使用者或應用程式可能需要查詢一張表中的多個列。隨著表中行的數量的增長,用於完成這些查詢的時間也在穩步增加。為了加速查詢並減少表規模的影響,謹慎的做法是索引表的列,以便在呼叫select查詢時,每個列中的條目幾乎可以立即獲得。
不幸的是,加速select函式通常會導致更常規的insert、update及delete命令的效能惡化。這很大程度上是因為索引本身必須不斷地與資料庫的內容保持同步,而這又意味著大量的資料庫引擎開銷。因此,具有諷刺意味的是,我們加速select查詢的嘗試可能導致整個資料庫變慢。這是過度索引的經典案例。
對所有列只提供乙個索引,並且該索引和查詢表所用到的主鍵不同,這種方法可以解決這個問題。我們也可能按最常用到最不常用對列進行排序。索引始終是乙個微妙的平衡,歸根結底要用對。
包羅永珍的域表不是資料庫設計的最佳方法。請記住,關聯式資料庫的構建思想:資料庫中的每個物件只代表乙個事物。任何資料集所代表的事物都不應該含糊不清。通過檢視主鍵、表名、列名和關係,我們應該可以快速解讀資料集的意義。儘管如此,對於資料庫設計,一種揮之不去的誤解是,表越多,資料庫就越混亂越複雜。
通常,把幾張表壓縮到一張表中就是簡化設計的原理。這聽上去是個好主意,但是,通常得到的是效率低下且難以操作的資料庫。sql**將變得很長,難以閱讀,也不自然。這將把兩種截然不同的東西混在一起。乍一看,域表看起來像乙個抽象的文字容器。從實現的角度來看,這是正確的,但是,這不是設計資料庫的最好方法。
作為規範化過程的一部分,隔離和分解資料最終形成每一行只代表乙個事物。每個域表與所有其他域表都不同。
多個域表的最終結果是:
資料庫設計人員和開發人員常常把他們的角色完全看作是技術角色。非技術方面(如遵守命名約定)往往被推到優先順序列表的較低位置,或者甚至完全被忽略。這可能是個災難性的錯誤。
命名也許是設計人員自行決定的,但是,事實上,它是資料庫文件的第乙個也是最重要的元素(我們接下來將**文件錯誤)。資料庫設計人員應該把他們的工作看作是在他們換了雇主或角色之後還將繼續存在的東西。命名約定的目的是,讓沒有完全參與該項目的人也能比較容易地快速理解表和列的內容。未來的管理員、開發人員或使用者不應當必須看完長長的文件才能理解某個表名或列名的意義。表如何命名的具體細節並未得到業界的一致同意。
最重要的是一致性。一旦我們遵循某個特定的風格來命名物件,那麼在整個資料庫中要堅持使用它。表名必須盡可能是表所代表的內容的完整或簡約描述,而列名應該清楚地表明其所代表的資訊。對於簡單資料庫,這並不難。但是,一旦我們構建彼此引用的表,事情就變得複雜了。嚴格遵循命名約定始終是正確的方向。
這樣的約定包括沒有列或表名的字元長度限制,以消除使用不易理解或記憶的首字母縮略詞的需要。如列名cust_dscr,任何人讀到這個名字都將不得不猜測該列包含的內容。customer_description則是個更好的列名,沒有迫使讀者展開他們的想象力。
避免冗餘:在一張名為「students(學生)」的表中,我們不必把列命標成studentname、studentaddress或studentgrade,因為name、address和grade已經足夠了。還有,不要使用保留字。用「index」來標記某列會讓人困惑,也會成為錯誤的**。可以用乙個描述性的字首,如studentindex。
如果資料庫開發人員和設計人員在確定命名約定的優先順序上碰到問題,那麼他們在文件方面就會存在更大的問題。對於開發人員來說,文件有時感覺像是開發過程中乙個微不足道的非必要方面。然而,很多在其他方面設計優秀的資料庫已經犧牲在糟糕文件的祭壇上。糟糕的文件極大地抑制了故障排除、結構改進、公升級和連續性。
資料庫設計人員必須始終想象他們會在某個時刻不再參與對該資料庫的支援。文件應該讓其他人容易接手資料庫設計、開發或管理。良好的文件必須包含列、表、關係和約束的定義,使之清楚地表明每個元素應該如何使用。如果我們可以包含示例以說明預期值,那麼效果會更好。
有些設計人員會使用糟糕的文件作為確保工作安全性的一種手段,即除了他們之外,沒有人能完全理解該資料庫。這是一種短視和注定失敗的策略,因為這幾乎總是導致管理層看透設計人員的意圖。糟糕的文件還讓我們作為設計人員多年後返工或改進這些**變得非常困難。
我們可以仔細地完成世界級資料庫設計所要求的所有步驟。但是,如果我們沒有對資料庫進行嚴格的測試,那麼我們將陷入黑暗之中。不幸的是,當專案延期時,測試階段受到的影響最大。這是弄巧成拙,因為乙個快速通過的資料庫會立即被錯誤及不一致性所困擾,而這些錯誤應該很容易在測試階段被識別和解決。
乙個滿是缺陷的資料庫不會讓使用者和管理員喜歡,即使最終修復了錯誤,我們也擺脫不了不好的名聲。在資料庫上線前,進行深入而廣泛地測試,這將大大減少部署到生產環境中後產生的故障的數量和規模。良好的測試不會找到每個錯誤,但是肯定有助於擺脫大多數錯誤。
資料庫開發和設計是任何資料密集型專案的核心,這些專案幾乎包含了所有業務應用程式。因此,設計過程應該始終在此上下文中進行審查。本文中列出的設計錯誤一開始會被看作是小而不起眼的問題。然而,最終,它們會極大地降低資料庫效能並且修復成本高昂。要從一開始就正確地做事,增加構建非常適合其預期目的資料庫的機率。
9 of the most common mistakes in database design
資料庫設計中的9大常見錯誤
作為資料庫設計人員,當我們負責資料庫專案時,在資料庫設計以及把資料庫部署到生產環境的過程中可能會遇到一些挑戰。其中一些問題不可避免,也無法控制。但是,其中相當一部分可以追溯到資料庫設計本身的質量。我們在初步階段所做的決定會對資料庫最終的工作情況有深遠的影響。如果我們要建一所房子,我們不會聘請一位工程...
資料庫設計中的9大常見錯誤
作為資料庫設計人員,當我們負責資料庫專案時,在資料庫設計以及把資料庫部署到生產環境的過程中可能會遇到一些挑戰。其中一些問題不可避免,也無法控制。但是,其中相當一部分可以追溯到資料庫設計本身的質量。我們在初步階段所做的決定會對資料庫最終的工作情況有深遠的影響。如果我們要建一所房子,我們不會聘請一位工程...
資料庫設計中的9大常見錯誤
作為資料庫設計人員,當我們負責資料庫專案時,在資料庫設計以及把資料庫部署到生產環境的過程中可能會遇到一些挑戰。其中一些問題不可避免,也無法控制。但是,其中相當一部分可以追溯到資料庫設計本身的質量。我們在初步階段所做的決定會對資料庫最終的工作情況有深遠的影響。如果我們要建一所房子,我們不會聘請一位工程...