轉自21CTO
軟體中有Bug的東西最終都會腐爛,這是一個普遍真理。
事情會慢慢起改變。
一開始看起來很酷很乾淨的東西,不知不覺就變成了「他們到底在想什麼」。
但這並不代表我們可以袖手旁觀,任其發展。
我們應該像一隻剛意識到自己被主人穿了襪子的貓一樣,對抗「代碼腐敗」。
程式碼腐敗的一個領域是資料庫設計,但這個領域沒有得到足夠的重視。在這裡,我將重點介紹一些你可能不太關注的、不太重要的資料庫設計技巧。
我們稱之為「小而重要的規則」。
每個表都有一個 ID 欄位這可能有些爭議,但我始終認為資料庫裡的每個表都應該有一個名為ID 的主鍵ID。
就是這樣,只是叫ID。注意,不是CustomerID,不是OrderID,只是ID。
它應該是一個自動遞增的整數值(或者,如果你有非常充分的理由UUID,例如分散式系統,也可以使用自動遞增的整數值)。
當然,該欄位應該有一個索引ID。
對於不是多對多關係交叉引用的表,你需要多字段鍵的情況應該非常非常罕見。
切勿在表名或字段名中添加空格在此,我向那些認為在表名或字段名中添加空格(或使用漢字)是個好主意的人致以永遠的鄙視。
你千萬別這麼乾,名稱中的空格會讓你使用引號,而你很容易忘記,這會讓你在編寫查詢時不禁自問:“到底帶空格還是不帶空格?” 這真是太麻煩了。
永遠不要使用空格,這樣你就再也不用為此煩惱了。
還有,為了可愛的貓王寶寶,請不要在名字中使用底線。我真不知道人們怎麼能忍受打出「像這樣的名字」。光是想,我的小手指就想去申請工傷賠償。
表名是複數
再次強調,這是一個很大的爭論,但我認為表格代表很多東西,而不是單一的東西。
因此,表格名稱應該始終使用複數形式。
例如,應該使用 Customers,而不是 Customer。
這樣,當你看到「customers」這個字時Orders,你就知道它指的是表格。如果你將表格命名為Order“order”,就會在“order”這個字周圍產生歧義。
你指的是表格本身還是表格中的一行?我知道這個問題已經討論過很多了。
我強烈傾向於使用複數名稱。
無論你做什麼,選擇一個系統並堅持下去。
外鍵要清楚標記還記得我上面提到的欄位ID嗎?現在它就派上用場了。如果表中有一行Orders引用了客戶(即外鍵),請將其命名為 name CustomerID。
任何命名的欄位<Entity>ID都將始終是該表的外鍵<Entity>。
在整個架構中一致地執行此操作,這樣就能始終清楚地了解哪些欄位是外鍵,以及這些欄位引用的是哪個表。
索引查詢的內容為出現在WHERE、JOIN或ORDER BY子句中的每個欄位新增索引。
堅持這樣做可以避免很多效能問題。
可能會有例外,但你應該透過索引(而不是索引不足)來發現它們。
假設需要索引,然後讓查詢分析器說服你刪除任何導致問題的索引。
參照完整性不是可選的確保表之間的關係保持完整,且資料庫中沒有孤立記錄,對於資料完整性至關重要。
所有現代關係型資料庫都具有引用完整性。
從一開始就嚴格遵循並執行它。
不要依賴程式碼來維護這些關係。資料庫本身就具備這種能力,我們應該充分利用它。
不要在程式碼中嵌入 SQL如果你曾經在程式碼中嵌入 SQL,哪怕“就這一次”,你也終生都會後悔。更別提它為「再來一次」打開了方便之門。
嵌入 SQL 會使你的程式碼變得雜亂無章,並與資料庫耦合,最終導致程式碼混亂不堪。
請記住,讓資料庫來做這些事吧。如果你非得需要在程式碼中使用 SQL,請將其與程式碼分開維護,並且不需要編譯器處理它。
將其儲存在單獨的文件中,這些文件可以嵌入或在程式碼外部使用,並且可以在不更改程式碼邏輯的情況下進行更新。
還有一些額外想法一般來說,如果資料庫能幫你做,你就讓它幫你做。資料庫處理資料的能力比你強 453.7 倍,不要試圖取代它們。
如果您想添加以 1、2、3 等結尾的字段,請不要這樣做。
閱讀有關規範化的內容。為列使用正確的資料類型。不要將布林值設為數字,也不要將日期設為字串。
強烈建議在每個表格中加入CreatedAt時間戳UpdatedAt欄位。你會驚訝地發現,你最終會慶幸自己這麼做。
使用觸發器自動產生這些時間戳,它們會變得實用且輕鬆。
還有參數化預存程序也是我們的好朋友,要盡可能地使用它們。查詢分析器在決定查詢資料的最佳方式方面比你高出一個數量級。
此外,請謹慎使用布林值。
Null 會將布林值轉換為量子態-在執行查詢之前,既不是真也不是假。
除非你確切了解 null 在特定上下文中的意義,否則請勿使用布林值。不要依賴字串值來定義狀態。
請使用枚舉值,確保資料永遠不會出錯。
例如不要status = ‘bananna’,因為有人誤操作了某個欄位而導致出錯。
結語
我在這裡給各位列了很多該做和不該做的事情。
再次強調,最重要的一點是製定一套規則,並嚴格執行。今天就這麼做,以後就能省去很多麻煩。相信我,未來的你會感謝現在的自己!
发表回复