《SQL樣式指南 SQL Style Guide》由會員分享,可在線閱讀,更多相關(guān)《SQL樣式指南 SQL Style Guide(11頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、SQL樣式指南 · SQL Style Guide
Overview 綜述
你可以直接使用這些指導方針,或者fork后創(chuàng)建自己的版本——最重要的是選擇一套方針并嚴格遵守它。歡迎通過提交issue或pull request來提交建議或修復bug。
為了讓閱讀了Joe Celko的《SQL ProgrammingStyle》的團隊能更容易采用這套規(guī)則, 這套原則被設計成與該書的兼容的形式。該指南在某些領(lǐng)域嚴格一些,在另一些領(lǐng)域松懈一些。 當然該指南比Celko的書更簡潔一些,因為Celko的書包含了一些趣聞和每一條原則后的理由。
將該文檔的Markdown format格式添加
2、到項目代碼庫中或?qū)⒃擁撁娴逆溄影l(fā)送給所有項目的參與者要比傳閱實體書容易得多。
Simon Holywell所著的《SQL樣式指南》以署名-相同方式共享 4.0 國際協(xié)議發(fā)布,改編自sqlstyle.guide。
General 一般原則
Do 應該做的事情
· 使用一致的、敘述性的名稱。
· 靈活使用空格和縮進來增強可讀性。
· 存儲符合ISO-8601標準的日期格式(YYYY-MM-DD HH:MM:SS.SSSSS)。
· 最好使用標準SQL函數(shù)而不是特定供應商的函數(shù)以提高可移植性。
· 保證代碼簡潔明了并消除多余的SQL——比如非必要的引號或括號,或者可以推導出的
3、多余WHERE語句。
· 必要時在SQL代碼中加入注釋。優(yōu)先使用C語言式的以/*開始以*/結(jié)束的塊注釋,或使用以--開始的行注釋。
Avoid 應避免的事情
· 駝峰命名法——它不適合快速掃描。
· 描述性的前綴或匈牙利命名法比如sp_或tbl。
· 復數(shù)形式——盡量使用更自然的集合術(shù)語。比如,用“staff”替代“employees”,或用“people”替代“individuals”。
· 需要引用號的標識符——如果你必須使用這樣的標識符,最好堅持用SQL92的雙引號來提高可移植性。
· 面向?qū)ο缶幊痰脑瓌t不該應用到結(jié)構(gòu)化查詢語言或數(shù)據(jù)庫結(jié)構(gòu)上。
Namin
4、g conventions 命名慣例
General 一般原則
· 保證名字獨一無二且不是保留字。
· 保證名字長度不超過30個字節(jié)。
· 名字要以字母開頭,不能以下劃線結(jié)尾。
· 只在名字中使用字母、數(shù)字和下劃線。
· 不要在名字中出現(xiàn)連續(xù)下劃線——這樣很難辨認。
· 在名字中需要空格的地方用下劃線代替。
· 盡量避免使用縮寫詞。使用時一定確定這個縮寫簡明易懂。
Tables 表名
· 用集群名稱,或在不那么理想的情況下,復數(shù)形式。如staff和employees。
· 不要使用類似tbl或其他的描述性的前綴或匈牙利命名法。
· 表不應該同它的列同名,
5、反之亦然。
· 盡量避免連接兩個表的名字作為關(guān)系表(relationship table)的名字。與其使用cars_mechanics做表名不如使用services。
Columns 列名
· 總是使用單數(shù)形式。
· 避免直接使用id做表的主標識符。
· 避免列名同表名同名,反之亦然。
· 總是使用小寫字母,除非是特殊情況,如專有名詞。
Aliasing or correlations 別名與關(guān)聯(lián)名
· 應該與它們別名的對象或與它們代表的表達式相關(guān)聯(lián)。
· 一般來說,關(guān)聯(lián)名應該是對象名的第一個字母。
· 如果已經(jīng)有相同的關(guān)聯(lián)名了,那么在關(guān)聯(lián)名后加一個數(shù)字。
· 總
6、是加上AS關(guān)鍵字,因為這樣的顯示聲明易于閱讀。
· 為計算出的數(shù)據(jù)命名時,用一個將這條數(shù)據(jù)存在表里時會使用的列名。
Stored procedures 過程名
· 名字一定要包含動詞。
· 不要附加sp_或任何其他這樣的敘述性前綴或使用匈牙利表示法。
Uniform suffix 統(tǒng)一的后綴
下列后綴有統(tǒng)一的意義,能保證SQL代碼更容易被理解。在合適的時候使用正確的后綴。
· _id?獨一無二的標識符,如主鍵。
· _status?標識值或任何表示狀態(tài)的值,比如publication_status。
· _total?總和或某些值的和。
· _num?表示該
7、域包含數(shù)值。
· _name?表示名字。
· _seq?包含一系列數(shù)值。
· _date?表示該列包含日期。
· _tally?計數(shù)值。
· _size?大小,如文件大小或服裝大小。
· _addr?地址,有形的或無形的,如ip_addr
Query syntax 查詢語句
Reserved words 保留字
保留字總是大寫,如SELECT和WHERE。
最好使用保留字的全稱而不是簡寫,用ABSOLUTE而不用ABS。
當標準ANSI SQL關(guān)鍵字能完成相同的事情時,不要使用數(shù)據(jù)庫服務器相關(guān)的關(guān)鍵字,這樣能增強可移植性。
White s
8、pace 空白字符
正確地使用空白字符對清晰的代碼十分重要。不要把代碼堆再一起或移除自然語言中的空格。
Spaces 空格
用空格使根關(guān)鍵字都結(jié)束在同一列上。在代碼中形成一個從上到下的“川流”,這樣幫助讀者快速掃描代碼并將關(guān)鍵字和實現(xiàn)細節(jié)分開。川流在排版時應該避免,但是對書寫SQL語句是有幫助的。
注意WHERE和FROM等關(guān)鍵字,都右對齊,而真實的列名都左對齊。
注意下列情況總是加入空格:
· 在等號前后(=)
· 在逗號后(,)
· 單引號前后('),除非單引號后面是括號、逗號或分號
Line spacing 換行
總是換行的情況:
9、
· 在AND或OR前。
· 在分號后(分隔語句以提高可讀性)。
· 在每個關(guān)鍵詞定以后。
· 將多個列組成一個邏輯組時的逗號后。
· 將代碼分隔成相關(guān)聯(lián)的多個部分,幫助提高大段代碼的可讀性。
讓所有的關(guān)鍵字右對齊,讓所有的值左對齊,在查詢語句中間留出一個空隙。這樣能提高速讀代碼的速讀。
Identation 縮進
為確保SQL的可讀性,一定要遵守下列規(guī)則。
Joins Join語句
Join語句應該縮進到川流的另一側(cè)并在必要的時候添加一個換行。
Subqueries 子查詢
子查詢應該在川流的右側(cè)對齊并使用其他查詢相同的樣式。有時
10、候?qū)⒂依ㄌ枂为氈糜谝恍胁⑼c它配對的左括號對齊是有意義的——尤其是當存在嵌套子查詢的時候。
Preferred formalisms 推薦的形式
· 盡量使用BETWEEN而不是多個AND語句。
· 同樣地,使用IN()而不是多個OR語句。
· 當數(shù)據(jù)輸出數(shù)據(jù)庫時需要處理時,使用CASE表達式。CASE語句能嵌套形成更復雜的邏輯結(jié)構(gòu)。
· 盡量避免UNION語句和臨時表。如果數(shù)據(jù)庫架構(gòu)能夠不靠這些語句運行,那么多數(shù)情況下它就不應該依靠這些語句。
Create syntax 創(chuàng)建語句
聲明模式信息時維護可讀代碼也很重要。所以列定義的順序和分組一定要有意義。
11、
在CREATE定義中,每列要縮進4個空格。
Choosing data types 選擇數(shù)據(jù)類型
· 盡量不使用供應商相關(guān)的數(shù)據(jù)類型——這些類型可不能能在老系統(tǒng)上使用。
· 只在真的需要浮點數(shù)運算的時候才使用REAL和FLOAT類型,否則使用NUMERIC和DECIMAL類型。浮點數(shù)舍入誤差是個麻煩。
Specifying default values 指定默認類型
· 默認值一定與列的類型相同——如果一個列的類型是DECIMAL那么就不要使用INTEGER類型作為默認值。
· 默認值要緊跟類型聲明并在NOT NULL聲明前。
約束和鍵
約束和鍵是
12、構(gòu)成數(shù)據(jù)庫系統(tǒng)的重要組成部分。它們能很快地變得難以閱讀和理解,所以遵從指導方針是很重要的。
Choosing keys 選擇鍵
設計時應該謹慎選擇構(gòu)成鍵的列,因為鍵既明顯影響著性能和數(shù)據(jù)完整性。
1. 鍵在某種程度上應該是獨一無二的。
2. 該值在不同表中的類型應該相同并且盡量不會更改。
3. 該值是否會無法通過某種標準格式(如ISO發(fā)布的標準)?如
4. 盡量讓鍵保持簡單,但在適當情況下不要害怕使用復合鍵。
以上是定義數(shù)據(jù)庫時合乎邏輯的平衡做法。當需求變更時,鍵也應該根據(jù)情況更新。
Defining constraints 定義約束
確定鍵后,就可以用約
13、束和字值段驗證來定義它們。
General 概述
· 表至少需要一個鍵來保證其完整性和可用性。
· 約束應該有名字,除了UNIQUE、PRIMARY KEY和FOREIGN KEY之外。
Layout and order 布局和順序
· 在CREATE TABLE語句后先定義主鍵。
· 約束的定義應該緊跟它相應的列的定義后。
· 如果該約束與多個列相關(guān),那么讓它盡量離與其相關(guān)的列距離越近越好。實在不行就講它放在表定義的最后。
· 如果是與整個表相關(guān)聯(lián)表級別的約束,那么就將放在表的定義的最后。
· 按照字母順序安排定義,ON DELETE排在ON UPDATE前。
·
14、 有道理的話,把所有相關(guān)的語句對齊。比如,把所有NOT NULL定義對齊到同一列。雖然這樣的做法有些慢,但是能提高可讀性。
Validation 校驗
· 用LIKE和SIMILAR TO約束來保證格式已知字符串的數(shù)據(jù)完整性。
· 當數(shù)字的值的范圍可以確定時,用CHECK()來防止錯誤的值進入數(shù)據(jù)庫或被錯誤地轉(zhuǎn)換。大部分情況下至少要確認值要大于零。
· CHECK()約束應該在單獨的語句中以便debug。
Example:
Design to avoid
· 面向?qū)ο笤O計思想并不適用于關(guān)系型數(shù)據(jù)庫——避免這個陷阱。
· 將值存入一列并將單位存在另一列。列的定義應該讓自己的單位不言自明以避免在應用內(nèi)進行合并。使用CHECK()來保證數(shù)據(jù)庫中的數(shù)據(jù)是合法的。
· EAV (Entity Attribute Value)表——用特殊的產(chǎn)品來處理無模式數(shù)據(jù)。
· 因為某些原因(如為了歸檔、為了劃分跨國公司的區(qū)域)將能合并在一起的表分開。這樣的設計導致以后必須使用UNION操作而不能直接查詢一個表。