[Database] 有效數據庫設計的目標

理解設計的重要性

設計是良好開發的前提和基礎,就如同建造摩天大廈,永遠不可能一上來就壘磚砌瓦,優秀的建築師必定要先做出一份詳細可靠的設計圖紙,建築工人再照此開工,從而平地起高樓,大廈入漢霄。
一個軟件的底層設計如果存在瑕疵,那麼整個系統就將存在潛在的危機,而且時間越長,問題可能越根深蒂固,難以改正,隨着開發的持續進行,爲了修正最終設計存在的問題所需付出的代價可能也會越來越大,甚至需要推翻所有重新來過,這對無論是管理者還是開發者來說都是極其痛苦的。
另一方面,一個有趣的例子是,項目經理髮現使用當前的技術和設計不能使將來的項目可靠運行,從而向上層領導提交這一建議,但結果卻是他被開除了;然而新來的項目經理也發現了同樣的問題,和上層領導反映時也同樣被開除;如此往復,看似上層領導不關心技術或設計細節,認爲不能實現是個人能力問題。解決問題的唯一方法只能是上層領導自己意識到錯誤並拋棄整個項目,重新設計。
數據庫設計也不例外,一個有問題的數據庫設計會導致整個項目的失敗,可能會導致諸多問題,無論項目的其他部分設計得多麼完美,整個系統終會崩潰。

數據庫的定義

顯示當中有很多數據容器,書本,衣櫃,郵箱甚至你的大腦,他們都存儲有一定的信息或者數據,雖然形式不同,但具有一些相似性,都存儲(Stores)着一些東西,你可以取出(Read)這些東西,再放入或者修改(Update)一些東西,甚至可以刪除(Delete)一些東西。這些性質也便是數據庫最基本的含義:

A database is a tool that stores data, and let you create, read, update and delete data in some manner.

理想數據庫的特性

不過書本,衣櫃,郵箱甚至大腦都不能稱之爲我們所認爲的數據庫(Database),一個理想的數據庫除了具有上述的基本功能,還需要具有一些必不可少的特性,比如持久、一致、安全、可用、可擴展、快等等。

CRUD

Create(C),Read(R),Update(U),Delete(D)。是四個理想數據庫所需具備的基本特性。這意味着你可以安全可靠,快捷一致地在數據庫中創建(Create),讀取(Read),更新(Update)和刪除(Delete)數據。

Retrieval

Retrieval 是 “read” 的同義詞,可獲取不僅僅意味着可讀性。首先要保證你可以找到所有數據,不能你插入了但是讀不到,無故丟失。
另外你可以組織數據格式,從而可以使用多種特定的方式來讀取他們,比如通過用戶ID或者用戶姓名來讀取用戶的地址,需要用戶選取合適的方式讀取數據。
讀取應該快速,方便,讀出的數據應該可靠一致。

Consistency

CRUD 的 “R” 的另一個方面是 consistency,一致性。這意味着你執行多次相同的查詢,數據庫返回的結果應該是一樣的,其他用戶執行相同的查詢,得到的結果也是一樣的(前提是所讀取的數據沒有被修改)。
一個良好的數據庫產品可以爲數據一致性提供技術保證和底層支持,但是不當的數據庫設計也有可能會導致數據不一致的問題,比如你在用戶信息表中保存有用戶聯繫信息,但卻在訂單表中保存了衝突的用戶聯繫信息,那麼當你需要聯繫用戶時,選擇哪個聯繫信息便存在問題。

Validity

Validity 和 consistency 相近,正確性意味着數據應該被驗證(Verify),其中的一個方面就是是否和數據庫中的其他數據存在衝突或不一致。
數據庫可以容易地驗證數據是否有正確的類型。比如日期格式不能輸入字符串。
數據庫也可以驗證一個用戶輸入的值存在於數據庫中的其他位置。比如城市字段應該只能輸入在城市表中存在的合法城市。
數據庫也可以檢查數據的某些狀態。比如用戶請求轉出100元錢,數據庫能夠檢查賬戶餘額是否夠這麼多錢並做出允許或者拒絕的操作。
數據庫能夠保證不允許錯誤的改變,比如要刪除一個城市,那麼數據庫會檢測這個城市下是否還存在用戶,如果存在,那麼只有刪除所有用戶,才能夠刪除城市。

Easy Error Correction

容易的錯誤改正在計算機的數據庫內是內置支持的功能,例如你可以輕鬆地修改訂單的錯誤拼寫的產品名稱,但是爲了能夠從這一功能中獲得最大益處,你需要良好地設計,比如選擇合適的數據存儲格式從而可以更快更有效地修改數據。

Speed

數據庫的速度非常重要,一個設計優良的數據庫可以快速地創建、讀取、更新和刪除數據。

Atomic Transactions

原子事務指的是一系列可能的複雜動作,而在其他事務看來是單一操作。比如你將100元從Alice的賬戶轉移到Bob的賬戶,沒有其他事物可以看到數據庫處於錢從Alice的賬戶移出但卻還沒有加入到Bob的賬戶的中間狀態。
原子事務要麼全部完成,要麼全部失敗,不能發生一半。
原子事務對於保證一致性和正確性相當重要,因此也對 CRUD 的 R 和 U 非常重要。

ACID

這個部分進一步介紹原子事物的細節而不是數據庫的特色。
ACID 是一個有效的事務系統所應該提供的四個特性的首字母縮寫:Atomicity(原子性),Consistency(一致性),Isolation(隔離性)和 Durability(持久性)。
原子性指的是事務應該是原子的,要麼全部成功,要麼全部失敗。
一致性意味着事務要確保數據庫在事務前後能夠都處於一致的狀態,換句話說,如果事務中的某些操作違反數據庫的規則,那麼事務就要全部回滾(Rollback),好像糟糕的事務從未發生過一樣。
隔離性意味着一個事務的細節對於其他所有事務來說都是不可見的,其他事務看不到自己的中間狀態,而只能看到事務開始前或提交後的狀態。

  • 當兩個事務操作相同的數據時,事務發生的順序可能會對兩個事務的成功與否產生重大影響。數據庫不能保證兩個事務的發生順序,但是可以保證當一個事務提交或回滾之後,再開始另一個事務。

持久性意味着一旦事務被提交,它所造成的結果就不會在之後消失,就算斷電重啓,事務的影響依然存在。

  • 一個高端數據庫可能通過提供持續映射(shadowing)來提供持久性。每個數據庫操作發生,它都被映射到另一個系統。如果主系統故障,映射數據庫可以立即開始服務。
  • 其他數據庫通過日誌來提供持久性,數據庫每執行一項操作,他就在日誌中記錄操作。當數據庫故障後重啓時,他可以重載上次保存的數據,從日誌中重新應用所有的操作。它比從映射數據庫重啓耗時,但消耗更多的資源,成本也更低。

數據庫爲了提供持久性,只有事務的改變被映射或者記錄到日誌中,否則不能認爲事務成功提交。
事務一旦被提交,它便結束。

Persistence and Backups

數據必須是持久的,不能自己改變或者消失。
數據庫產品盡己所能保證數據的安全。但是對於突發意外情況,用戶必須自己想辦法處理,比如磁盤損壞,發生火災,或者人爲刪除。在這些情況下,數據庫無法幫你,你需要進行常規的備份。
如果少量的數據損失對你的影響不大,你可以每日備份,並在事故後一兩個小時進行還原。
但如果數據庫非常易變而且少量的數據損失會造成很大的問題,比如紐約交易所的股票交易,這顯然需要不同的備份策略。一些高端數據庫產品允許你使用映射(shadow)每個發生的數據庫操作,所以你能夠得到一切所發生事務的完整拷貝,並在幾分鐘內恢復。一些數據庫甚至可以在主庫故障時直接切換備庫,用戶感覺不到發生了什麼。

Low Cost and Extensibility

理想的數據庫應該是容易獲取和安裝,廉價並且可擴容的。有一天希望增加數據庫容量的要求顯然非常正常。
花費和容量更多的是數據庫的特點而不是數據庫設計,不過良好的設計有助於可延展性。比如增加某些表來增加數據庫的功能。

Easy of Use

對於程序員或者相關的數據庫使用者來說,好的數據庫設計也意味着數據庫容易理解和使用,這包括可讀性高的表名,字段名和其他數據庫實體。易於理解的結構和數據可以使程序員更容易地進行開發。

Portability

便攜性,計算機數據庫具有比筆記本更強大的便攜性,通過網絡,你可以隨時隨地遠程訪問你的數據庫,不管相距多遠。但另一方面,這種便攜性也會導致安全性的問題。

Security

你可以在世界各地訪問你的數據庫,黑客當然也可以。
數據庫安全性有賴於網絡安全和數據庫工具本身的安全機制。
你可以將數據分類,將對數據的訪問劃分權限,並給予相應的用戶,這不僅可以降低某些用戶誤操作自己無權訪問的數據的可能性,而且也會降低黑客冒充某一用戶對數據庫其他數據的破壞的可能性。

Sharing

現代網絡允許成百上千的用戶從不同地方同時訪問同一數據庫,獲得相同的信息。
通過對數據庫用戶進行訪問權限的控制,也可以降低網絡中傳輸的數據量。
合理地組織數據也可以確保用戶修改某些數據時,儘量只有必須的少量數據被鎖定,而可以有更多的其他數據可以被別的用戶修改。
良好的設計也可以允許數據庫進行一些計算,只發送所需的計算結果而不是所有的數據。

Ability to Perform Complex Calculations

計算機執行有限地、有規則的、重複性地計算任務可以比人腦更加快速和可靠,並且不會厭煩,能夠不斷重複執行。在硬件和程序正常的情況下,可以出色地完成各種計算任務。數據庫支持進行某些計算,但這也依賴於良好地數據庫設計,否則你根本就無法獲取所需要的數據來進行計算。

參考資料

[1] Stephens R. Beginning Database Design Solutions[M]. Wiley Publishing, 2008.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章