1. 什么是數據字典
數據字典是描述數據的信息集合,是對系統中使用的所有數據元素的定義的集合。通常一般用戶是無法修改數據字典的,只有程序維護人員有編輯、修改數據字典的權限
在開發的程序中,數據字典可以幫助開發人員理解各個數據項目的類型、數值和它們與現實世界中的對象的關系。
例如:
下面這些具有相同類型的配置項,配置到系統的數據字典表中,方便系統維護,由超級管理員統一在后台進行數據字典維護,如果用戶需求要增加變更配置項,只需要修改數據字典表記錄即可,不需要修改代碼。
又或者說:
比如在系統中某些選項是幾個特定的值的一個或多個,並且隨着發展還可以動態添加。比如支付方式,配送方式等。此時就可以考慮設計數據字典表。在后台進行管理,然后前台要從后端查詢。
主動數據字典:指在對數據庫或應用程序結構進行修改時,其內容可以由DBMS自動更新的數據字典。
被動數據字典:指修改時必須手工更新其內容的數據字典。
1.1 建立數據字典的目的
- 提高開發效率,降低研制成本。數據字典是數據庫開發者、數據監管人和用戶之間的共同約定,是系統說明書的一個重要組成部分。一個統一的數據字典有助於開發者建立數據模型以及程序和數據庫之間的數據轉換接口,為規范化設計和實施數據管理系統鋪平了道路。
- 促進數據共享,提高數據的使用效率。通過數據字典,用戶可以方便地知道每項數據的意義,了解數據的來源和使用方法,從而幫助用戶迅速地找到所需的信息,並按照正確的方法使用數據。
- 控制數據的使用。在某些特定的場合,可以通過對數據字典的控制達到控制數據使用的目的。
2. 如何設計數據字典
- 方式一:在java文件中定義數據字典項
把應用中遇到的數據字典項都定義到一個java文件中,這是最常用的方法,實現起來比較簡單,但維護起來就非常繁瑣,特別是數據字典項比較多的情況下,相應的java文件就會比較大,一旦數據字典項有更新那么維護起來就比較費時費力。
在java文件中定義數據字典項通常情況下定義為static,好處是可以通過類名直接調用。
舉例:
類ReportConstants中定義了以下數據字典項。
public static final int CODE_USERINF_TECHELEVEL_GJ = 1;
public static final String CODE_USERINF_TECHELEVEL_GJ_KEY = "高級";
public static final int CODE_USERINF_TECHELEVEL_ZJ = 2;
public static final String CODE_USERINF_TECHELEVEL_ZJ_KEY = "中級";
public static final int CODE_USERINF_TECHELEVEL_CJ = 3;
public static final String CODE_USERINF_TECHELEVEL_CJ_KEY = "初級";
public static final int CODE_USERINF_TECHELEVEL_WJ = 4;
public static final String CODE_USERINF_TECHELEVEL_WJ_KEY = "無職稱";
那么我們在實現中就可以直接引用相應的數據字典項編碼及名稱,另外,一般情況下需要定義數據字典項編碼和名稱的轉換方法,比如:
public static String getCodeName(int lCode){
//初始化返回值
String strReturn = "未知";
switch (lCode){
case CODE_USERINF_TECHELEVEL_GJ :
strReturn = CODE_USERINF_TECHELEVEL_GJ_KEY;
break;
case CODE_USERINF_TECHELEVEL_ZJ :
strReturn = CODE_USERINF_TECHELEVEL_ZJ_KEY;
break;
case CODE_USERINF_TECHELEVEL_CJ :
strReturn = CODE_USERINF_TECHELEVEL_CJ_KEY;
break;
case CODE_USERINF_TECHELEVEL_WJ :
strReturn = CODE_USERINF_TECHELEVEL_WJ_KEY;
break;
}
return strReturn;
}
這個方法實現了通過數據字典項編碼獲得數據字典項名稱的功能。那么還需要實現一個對應的方法,getCodeByName(String name),即通過數據字典項名稱獲取數據字典項編碼功能(代碼這里省略)。這樣就可以實現數據字典項編碼和名稱的相互轉換啦。
★★★★但是一旦出現數據字典項名稱或編碼需要更改(“無職稱”項編碼需要由“4”改為“0”),或增加減少數據字典項,都需要更新java文件代碼。★★★★
- 方式二:在xml文件中定義(繁瑣,不介紹)
- 方式三:使用數據庫表
方案一:使用一張表
參考【講了每個字段的意義】:https://github.com/Jessicahust/translation/blob/master/tiemao_2016/03_dict_table_design/03_dict_table_design.md
個人認為比較通用的設計字典表:
或者
CREATE TABLE `data_dictionary` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`code` varchar(36) COLLATE utf8mb4_bin NOT NULL COMMENT '編碼',
`name` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '名字',
`code_type` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '編碼類型',
`desc` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '描述',
`parent_id` int(11) DEFAULT NULL COMMENT '父ID',
`status` int(2) DEFAULT NULL COMMENT '狀態 0禁用 1使用',
`create_time` datetime DEFAULT NULL COMMENT '創建時間',
`update_time` datetime DEFAULT NULL COMMENT '修改時間',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
或者【來源尚衣通項目】
parent_id:上級id,通過id與parent_id構建上下級關系,例如:我們要獲取所有行業數據,那么只需要查詢parent_id=20000的數據。
name:名稱,例如:填寫用戶信息,我們要select標簽選擇民族,“漢族”就是數據字典的名稱。
value:值,例如:填寫用戶信息,我們要select標簽選擇民族,“1”(漢族的標識)就是數據字典的值。
dict_code:編碼,編碼是我們自定義的,全局唯一,例如:我們要獲取行業數據,我們可以通過parent_id獲取,但是parent_id是不確定的,所以我們可以根據編碼來獲取行業數據。
方案二:使用兩張表[不詳解了,個人更喜歡第一種]