數(shù)據(jù)倉庫建設(shè)規(guī)范
點(diǎn)擊上方“數(shù)據(jù)管道”,選擇“置頂星標(biāo)”公眾號(hào)
干貨福利,第一時(shí)間送達(dá)

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