轉自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… Continue reading
Search
页面
分类目录
- 3DS MAX (2)
- Access (2)
- Adobe (28)
- Alexa (1)
- Android (3)
- Apple (11)
- ARM (1)
- ASP.NET (11)
- AutoCAD (1)
- Avaya (8)
- Baidu (1)
- BEA (1)
- Bing (1)
- BlackBerry (1)
- Brocade (3)
- BCFP (2)
- C#/C++ (13)
- C++ (9)
- casino (1)
- CheckPoint (5)
- CISA (1)
- Cisco (312)
- CCA (1)
- CCDA (4)
- CCDE (7)
- CCDP (2)
- CCENT (1)
- CCIE (24)
- CCNA (71)
- 640-802 (23)
- CCNA Security (1)
- CCNA Service Provider Operations (1)
- CCNP (44)
- 642-832 (1)
- CCNP Security (4)
- 300-207 (1)
- CCNP Voice (2)
- CCNP Wireless (2)
- CCSP (2)
- CCVP (3)
- CISSP (2)
- Citrix (8)
- CIW (25)
- Cloudera (1)
- COMPTIA (61)
- CWNP (2)
- Dassault Systemes (1)
- Ebook (139)
- Sybase (2)
- EC-COUNCIL (5)
- EMC (13)
- EXIN (5)
- Flash (1)
- Fortinet (4)
- Google (10)
- H3C (1)
- HDI (1)
- Hitachi (1)
- HP (42)
- HTML (1)
- Huawei (22)
- IASSC (1)
- IBM (164)
- IIA (3)
- Infosys (1)
- Introduction (2)
- ISACA (1)
- ISC (1)
- ITcert (2)
- ITIL (9)
- J2EE (4)
- Juniper (8)
- Juniper Networks (16)
- Linux (65)
- LPIC (15)
- LPIC Level 1 (4)
- LPIC Level 2 (1)
- LPIC Level 3 (2)
- Microsoft (270)
- MySQL (18)
- NetApp (7)
- Network Appliance (2)
- News (406)
- Nortel (1)
- Novell (3)
- Office (4)
- Oracle (230)
- PHP (14)
- PMI (9)
- PMP (5)
- PRINCE2 (2)
- Prometric (3)
- Red Hat (8)
- RedHat (1)
- RSA (1)
- Salesforce (1)
- SAP (32)
- SAS Institute (2)
- SASInstitute (1)
- SCP (1)
- SharePoint (1)
- SOA (2)
- SQL (2)
- Subversion (1)
- SUN (64)
- Symantec (14)
- Tech (1)
- TestPassPort (7)
- The Open Group (2)
- TOGAF 9 (1)
- TibcoSoftware (2)
- TQC (3)
- unix (2)
- VB (2)
- VCP (1)
- VCP-410 (2)
- VMware (20)
- VCAP (1)
- VUE (5)
- Yahoo (1)
- 考試心得 (7)
标签
1Z0-851 10G 350-701 640-802 642-813 642-832 642-902 A+ C++ ccie ccna ccnp Cisco CIW CIW認證 COMPTIA Ebook Google IBM java Java Standard Edition 6 Programmer Certified Professional Exam Linux MCITP MCPD MCSE MCTS Microsoft MySQL News News OCA OCP Oracle PHP PMP RHCE SCJP SCWCD Security+ SQL SUN SY0-301 TestPassPort Windows Server 2008 程式設計链接表
IT Certification