一文完全解讀數(shù)據(jù)倉庫建設(shè)規(guī)范
1 概述
本文檔制定了XX數(shù)據(jù)倉庫中數(shù)據(jù)庫對象的命名規(guī)范(用戶、表、視圖、存儲過程、函數(shù)、表分區(qū)、主鍵、索引、序列等)、數(shù)據(jù)庫編程規(guī)范,JAVA編程規(guī)范為系統(tǒng)設(shè)計和開發(fā)工作提供統(tǒng)一的命名標準,提高系統(tǒng)的規(guī)整性和代碼的可讀性,減輕維護工作量,提高工作效率。
2 數(shù)據(jù)庫對象命名規(guī)范
2.1? 層次劃分
?
序號 | 模型層次 | 用途 |
1 | ODS | 存放來自各個系統(tǒng)的原始數(shù)據(jù); |
2 | DW | 根據(jù)業(yè)務分析需求,對主題域內(nèi)的數(shù)據(jù)進行輕度匯總; |
3 | DM | 建立跨域的業(yè)務主題模型; |
4 | DIM | 統(tǒng)一服務于數(shù)據(jù)中心的參數(shù)表; |
5 | APP ? | 應用層,用于生成報表 |
6 | XX | XX |
數(shù)據(jù)層級按照自己數(shù)據(jù)倉庫規(guī)劃的命名即可~
2.2? 表、視圖、存儲過程、函數(shù)命名規(guī)范
<對象類型><_模型層次><_主題><_對象描述>[_匯總類型][_存儲類型]
說明:<> 尖括號中的內(nèi)容為必須項,適用于所有用戶層對象,[] 方括號中的內(nèi)容為可選項,會因用戶層及對象的不同而不同
命名約束:數(shù)據(jù)庫對象命名可能受最大長度限制,因此在實際命名中如果按照規(guī)范約定的命名方式存在超長的現(xiàn)象,需要開發(fā)人員靈活控制。
2.2.1 對象類型
<對象類型><_模型層次><_主題域><_對象描述>[_匯總類型][_存儲類型]。
適用范圍:所有用戶層對象。
對象類型 | 對象 | 說明 |
TB | TABLE | 表 |
VW | VIEW | 視圖 |
…… | …… | …… |
?
2.2.2 模型層次
<對象類型><_模型層次><_主題域><_對象描述>[_匯總類型][_存儲類型]
說明:對象屬性一般為對象歸屬用戶的簡寫。
適用范圍:所有用戶層對象??梢詤⒄兆约旱膶ο髮傩悦?guī)范,對此不要求統(tǒng)一。
?
模型層次 | 說明 |
ODS | 獲取層,存放從各個源系統(tǒng)接收的原始數(shù)據(jù); |
DW | 根據(jù)業(yè)務分析需求,對數(shù)據(jù)進行匯總, 應用分析原則優(yōu)先訪問DW層,其次DWD層,不允許訪問ODS層; |
DM | 建立跨域的業(yè)務主題模型; |
DIM | 維表 |
APP | 報表層,根據(jù)DM模型數(shù)據(jù)生成報表。 |
?
2.2.3 主題域
<對象類型><_模型層次><_主題域><_對象描述>[_匯總類型][_存儲類型][_][序號或描述]
說明:主題域是對數(shù)據(jù)進行大類劃分,不同用戶下的分類有所不同。適用所有業(yè)務層;每個新增的業(yè)務主題均需到該規(guī)范備案登記。
主題域 | 命名 | 簡稱 | 描述 |
客戶域 | Customer | XX | 泛客戶 |
… | … | … | … |
?
2.2.4 對象描述
<對象類型><_模型層次><_主題域><_對象描述>[_匯總類型][_存儲類型]
適用范圍:所有用戶層對象;
對象描述要求簡潔準確,盡可能的直觀表達對象的含義,通常包含業(yè)務+功能;
如果是通用命名規(guī)則:<對象類型><_模型層次><_主題域><_對象描述>[_匯總類型][_存儲類型],這里的對象描述是多業(yè)務的合成體,這時不加業(yè)務。
匯總類型
<對象類型><_模型層次><_主題域><_對象描述>[_匯總類型][_存儲類型]
適用范圍:除字典表、日志表之外的對象。
描述 | 匯總類型 |
日 | DAY |
月 | MON |
年 | YEAR |
2.2.5 存儲類型
<對象類型><_模型層次><_主題域><_對象描述>[_匯總類型][_存儲類型]
適用范圍:所有用戶層除日志、字典表、維表之外的對象。
對象描述 | 存儲類型 | 說明 |
目標程序 | 無 | |
臨時表 | TMP | 程序中臨時使用的中間表,用于存放程序運行中使用的臨時數(shù)據(jù),程序運行結(jié)束后表由程序自行清空,只保留結(jié)構(gòu)。 |
配置表 | CFG |
2.2.5.1??? 日表
日表以統(tǒng)計周期字段做日分區(qū)。數(shù)據(jù)保留周期為業(yè)務需要的周期,月底最后一天的數(shù)據(jù)不保存,如有需要則沉淀到月表中。
2.2.5.2??? 月表
月表以統(tǒng)計周期字段做月分區(qū)。除該字段外,其余字段與日表必須相同。數(shù)據(jù)保留周期為業(yè)務需要的周期。所有的月報表、月KPI數(shù)據(jù)必須從月表出,禁止從日表出。
2.2.5.3??? 周表
周表數(shù)據(jù)保留周期為業(yè)務需要的周期。
2.3? 其他對象命名規(guī)范
對象 | 命名規(guī)則 | 說明 |
表分區(qū) | 根據(jù)實際情況自行確定 | 建議等 |
主鍵 | PK<_表名><_列名> | |
索引 | IDX<_表名><_列名> | |
… | … | … |
?
2.4? 常用字段命名規(guī)范
字段名 | 數(shù)據(jù)類型 | 字段說明 | 備注 |
常用字段1 | 常用類型1 | 字段說明1 | 備注1 |
字段命名需做到見名知其意,避免用中文拼音,或者拼音+英語的方式。
可以參考企業(yè)現(xiàn)有業(yè)務數(shù)據(jù)庫的數(shù)據(jù)字典命名。
2.5? 常用單位規(guī)范
約定數(shù)據(jù)倉庫中字段的默認單位,比如車速默認單位是KM/h。
2.6? 數(shù)據(jù)庫對象命名注意事項
命名盡量采用富有意義的英文詞匯,不準采用漢語拼音。
XX……
2.7? 數(shù)據(jù)倉庫建表注意事項
表名,列名等需要添加注釋,否則不予上線。
XX……。
3?? 主機目錄及文件命名規(guī)范
3.1? 用戶命名規(guī)范
主機用戶名命名規(guī)范:
序號 | 主機用戶名 | 賬號類型 | 用途 |
1 | hadoop | 應用程序賬號 | hadoop集群管理用戶 |
2 | … | ftp賬號 | … |
3.2? 目錄規(guī)劃
<根目錄>/<二級目錄>/[三級目錄/]<業(yè)務域>[/自定義]
目錄規(guī)劃不做強制性的要求,但是要做到層次清晰、命名規(guī)范,見名知意。
l? 根目錄
?? ?? 取值為:根據(jù)物理存儲掛載情況而定;
l? 二級目錄
?? ?? 取值為:主機如果沒有文件系統(tǒng)掛載點,則二級目錄為用戶家目錄,否則取值用戶名;
l? 三級目錄
取值為:用戶自行定義,如果存儲在用戶家目錄下則需要三級目錄;
l? 業(yè)務域
取值為:抽取的文件按業(yè)務類型進行分類存儲。
業(yè)務簡稱 | 說明 |
業(yè)務1 | 說明1 |
業(yè)務2 | 說明2 |
?
l? 自定義
取值為:可選項,如果文件存儲有其它要求,可根據(jù)實際情況靈活調(diào)整,如需要分省存放等。
3.3? 文件命名規(guī)范
<文件類型>_<主題域>_<數(shù)據(jù)周期>_<接口文件序號>.dat
主題域
主題域取值情況咱定為各項目名稱:
數(shù)據(jù)周期
取值為:周期日數(shù)據(jù)8位長度,YYYYMMDD,月數(shù)據(jù)6位長度YYYYMM;
接口文件序號
取值為:接口文件序號長度為3,默認從000開始;
3.4? 文件格式規(guī)范
文件分隔符
文件字段盡量不采用定長分隔,采用“|”等特殊字符作為分隔符,另外在抽取文件時需要確定字段內(nèi)容中不會出現(xiàn)分隔符字符,以免錯列;
文件編碼
文件編碼采用UTF-8。
4?? 數(shù)據(jù)保存周期規(guī)范
周期類型 | 模型層次 | 保留周期(HIVE) | 備注 |
日 | ODS | 365 | …… |
5?? 數(shù)據(jù)庫編程規(guī)范
5.1? 參數(shù)和變量命名規(guī)范
5.1.1 對象變量
對象變量命名規(guī)則如下:
命名規(guī)則:<對象類型><_><變量描述>
......
5.1.2 參數(shù)和對象命名注意事項
所有名稱采用英文單數(shù)名詞或動詞,避免出現(xiàn)復數(shù)。
固定長度的字符串類型采用char,長度不固定的字符串采用varchar,一定要避免長度不固定的情況下采用char。
如無特殊需求,避免使用大字段(blob, clob, long, text, image 等)。
命名使用英文單詞,避免使用拼音,特別不應該使用拼音簡寫。命名不允許使用中文或者特殊字符。
命名中若使用特殊約定或縮寫,則必須要注釋說明。
使用有意義、易于記憶、描述性強、簡短及唯一的英文單詞。自已特有的命名風格,要自始自終保持一至,不可來回變化。
對于變量命名,禁止取單個字符(如i、j… ),建議除了要有具體含義外,還能表明變量
除非必要,不允許使用數(shù)字或較奇怪的字符來定義標識符。
5.2? 書寫規(guī)范
5.2.1 代碼大小寫規(guī)范
所有數(shù)據(jù)代碼統(tǒng)一使用小寫字母書寫,以方便不同數(shù)據(jù)庫之間的移植,同時也避免程序調(diào)用問題。參數(shù)和局部變量,全局變量用大寫。
……
5.2.2 代碼縮進規(guī)范
程序塊采用縮進風格書寫,保證代碼清晰易讀,風格一致??s進格數(shù)統(tǒng)一為 4 格。
必須使用空格,禁止使用TAB鍵。
同一條語句占用多于一行時,每行的第一個關(guān)鍵字應當右對齊。
對于Insert … values 和update 語句,一行寫一個字段,這段后面緊跟注釋(注釋語句左對齊),vales 和insert 左對齊,左括號和右括號與insert、values 左對齊
insert...select語句中,應使每行的字段順序?qū)悦啃胁怀^80字符為準,以增強可讀性。
5.2.3 空格及換行
關(guān)鍵字之后要留空格。
創(chuàng)建表、存儲過程、函數(shù)時,表名、存儲過程名和函數(shù)名之后不要留空格。
不允許把多個語句寫在一行中,即一行只寫一條語句。
相對獨立的程序塊之間、變量說明之后必須加空行。
超過80字符的語句要分行書寫,長表達式應在低優(yōu)先級操作符處換行,操作符或關(guān)鍵字放在新行之首。劃分出的新行應適當?shù)乜s進,使排版整齊,語句可讀。
if后的條件要用括號括起來,括號內(nèi)每行最多兩個條件。
不同類型的操作符混合使用時,建議使用括號進行隔離,以使代碼清晰。
減少控制語句的檢查次數(shù),如在else(if…else)控制語句中,對符合條件頻率高的盡量放到前面。
盡量避免使用嵌套的if語句,在這種情況應使用多個if語句來判斷其可能。
5.2.4 其它
避免使用select * 語句。
insert 語句必須給出字段列表,否則對后續(xù)表的擴展回帶來維護上的麻煩。
當一個SQL 語句中涉及到多個表時,必須使用別名來限定字段名,這使其它人閱讀起來更方便,避免了含議模糊的引用,其中能夠別名中清晰地判斷出表名。
確保變量和參數(shù)在類型和長度與表數(shù)據(jù)列類型和長度相匹配。
5.3? 注釋規(guī)范
一般情況下,源程序有效注釋量不低于30%以上。說明:注釋的原則是有助于程序閱讀理解,便于后期維護,在該加的地方都加了,注釋不宜太多但也不能太少,注釋語言須準確、易懂、簡潔。
所有變量定義需要加注釋,說明該變量的用途和含義。
注釋內(nèi)容要清晰明了,含義準確,防止注釋二義性。
禁止在注釋中使用縮寫,特別是非常用的縮寫。
注釋與所描述代碼進行同樣的縮排。
對程序分支必須書寫注釋。
保證代碼和注釋的一致性。修改代碼同時修改相應的注釋,不再有用的注釋要同步刪除。
注釋應與其描述的代碼相似,對代碼注釋應放在其上方或右方(單條語句的注釋)相應的位置,不可放在下面。
注釋上面的代碼應空行隔開。
統(tǒng)一文件頭的注釋。
在代碼的功能、意圖層次上進行注釋,提供有用、額外的信息。
函數(shù)應對返回代碼詳細描述。
盡量使用”#”進行注釋。
避免在一行代碼或表達式的中間插入注釋。
所有硬編碼必須加注釋,如 id='0' 則需要優(yōu)先注釋 '0'的含義, 或者在注釋中說明對應的字典表。
5.4? 語法規(guī)范
所有DDL和DML語句盡量遵循標準SQL,以SQL99為基準。
說明:采用標準SQL編寫,方便移植時各種數(shù)據(jù)庫之間做對應修改。
正例:
delete from table1;
反例:
delete table1;
數(shù)據(jù)類型采用基本數(shù)據(jù)類型,盡量不要使用某數(shù)據(jù)庫特有的類型。
說明:采用基本數(shù)據(jù)類型,各種數(shù)據(jù)庫均支持,減少不同版本的維護。設(shè)計數(shù)據(jù)類型和長度時要考慮應用編程開發(fā)的方便以及后續(xù)可維護性。
l對于特別復雜的sql(特別是多層嵌套,帶字句或相關(guān)的查詢),應先考慮是否設(shè)計不當引起,對復雜的sql可以通過程序?qū)崿F(xiàn),原則上遵循一句話只做一件事情,避免多重嵌套SQL的使用。必要時采用中間表。
對于超過2個以上的大表關(guān)聯(lián),必須進行執(zhí)行計劃驗證,并在設(shè)計中有所體現(xiàn)。
不要將空的變量值直接與比較運算符比較。如果變量可能為空,應該使用is null或is not null來進行比較。
每個程序過程生成的目標數(shù)據(jù)表不允許出現(xiàn)空值。
盡可能地使用相關(guān)表字段的類型定義,如%type,%rowtype等。
對數(shù)據(jù)庫腳本代碼中所定義的變量要進行初始化。\
?……
5.5? 程序結(jié)構(gòu)
5.5.1 程序結(jié)構(gòu)模板
定義一個模板供大家參考!
5.5.2 程序代碼
5.5.2.1??? 程序代碼規(guī)范
程序代碼段左側(cè)要留有1個縮進(4個空格)。
除特殊程序(如空調(diào)度、日志程序等)外,程序開始、程序結(jié)束、程序出錯時都要記錄日志,日志記錄使用公用的函數(shù)或存儲過程,具體使用方法參見后面日志內(nèi)容。
關(guān)鍵字要換行輸寫,不同行關(guān)鍵字要右對齊。
對于內(nèi)容超過一行的代碼,換行時要有一個縮進,并注意對齊以保證美觀。
每個字段后面都要有字段說明(字段描述、值內(nèi)容、單位等),字段說明要對齊。
字段說明內(nèi)容可以換行,但同樣要與上行字段說明內(nèi)容對齊。
對于比較簡單的SQL語句,也可根據(jù)實際情況寫在一行或幾行中,但多行的要注意縮進,并且要注意美觀性。
對于insert字段數(shù)量比較多的語句,對應的select中的字段盡可能定義別名,別名要與insert中字段名相同,這樣很容易找到字段的對應關(guān)系。
對于多層嵌套,一定要注意各層嵌套的縮進層次,才能保證代碼良好的可讀性,否則代碼將非常難讀。
關(guān)鍵字、保留字之間必須留有空格。
……
5.5.2.2??? 程序代碼示例
XXXX
5.5.3 程序日志
5.5.3.1??? 日志分類
程序日志分為兩種:
一種是記錄程序運行狀態(tài)情況,一個程序運行一次只記錄一條日志,包括程序名稱、目標表名、統(tǒng)計時間、程序運行開始和結(jié)束時間、運行狀態(tài)、出錯位置和出錯信息等,用于簡單查詢程序運行情況,以及以后可能的日志監(jiān)控。
一種是記錄程序運行過程情況,一次程序運行會記錄多條日志,每條日志記錄程序中不同階段的運行狀況,用于跟蹤程序中各階段的運行狀況。與單條日志記錄相比,時間上只記錄運行開始時間即可。
5.5.3.2??? 日志記錄
考慮如何記錄程序日志,制定日志規(guī)范!
5.6? 分區(qū)管理規(guī)范
分區(qū)表的分區(qū)增加、分區(qū)刪除操作,統(tǒng)一由分區(qū)控制程序完成,應用數(shù)據(jù)處理程序中不允許包含增加、刪除分區(qū)的操作;分區(qū)表清空分區(qū)的操作,應在應用數(shù)據(jù)處理程序中進行,這樣可以避免因為程序多次運行導致的數(shù)據(jù)重復。
保留多個周期數(shù)據(jù)的表必須建立分區(qū),分區(qū)鍵可以根據(jù)業(yè)務需要和數(shù)據(jù)大小分為日、月、年,這樣即可以避免因為表越來越大導致程序運行速度越來越慢,又解決分區(qū)太多浪費空間。全量替換的數(shù)據(jù)表(如維表、臨時表)可以不建立分區(qū)。
日分區(qū)表禁止保留月底最后一天數(shù)據(jù),如果要用到月底最后一天數(shù)據(jù),需要單獨建立月表保存。
?
6?? JAVA編碼規(guī)范
6.1? 避免引發(fā)錯誤的編寫規(guī)范
使用字符串的equals方法比較判斷時,如有常量字符串,一定要養(yǎng)成常量在前,變量在后的編寫習慣。
養(yǎng)成這種編碼習慣能夠有效減少當比較的變量是null時發(fā)生空指針的錯誤
在finally中執(zhí)行關(guān)閉操作,能夠確保出現(xiàn)異常時數(shù)據(jù)庫連接、IO讀寫句柄被正常關(guān)閉。
……
6.2? 編程注意事項說明
明確方法功能,精確(不是近似)地實現(xiàn)方法的設(shè)計。一個方法僅完成一件功能,即時簡單功能也應該編寫方法實現(xiàn)。
異常捕獲后,如果不對改異常進行處理,則應該記錄日志或使用。
如果是自己拋出的異常,則必須要填寫詳細的異常描述信息,這樣才能方便。
判斷時要注意運算符的優(yōu)先級,并用括號明確表達式的操作順序,避免使用默認的優(yōu)先級。
不要在循環(huán)體內(nèi)定義變量。
……
6.3? 程序排版及注釋規(guī)范
6.3.1 程序排版
程序塊要采用縮進風格編寫,縮進的空格數(shù)為4個。
……
6.3.2 程序注釋
一般情況下,源程序的有效注釋量必須在30%以上。
類或者接口的注釋需要包含其功能描述、使用方法、注意事項、作者、始于那個版本。
……
7?? shell編碼規(guī)范
7.1? shell編程案例
?制定程序案例,供大家參考
8? ?完整的規(guī)范文檔結(jié)構(gòu)


更多閱讀
特別推薦

點擊下方閱讀原文加入社區(qū)會員
