1. 程式人生 > >資料庫字典表設計

資料庫字典表設計

在稍大一些的專案中,我們總是需要管理各種各樣的型別型別資料(如商品型別、遊戲型別。。。)。對於這些型別的管理類似,如果為每 
一種型別都建立一張表去維護(而在專案中,正常出現50種類型),那工作量是可想而之大,並且我們不得不去了解每一個型別表的名字, 
以去關聯它。 

   因此,我們需要一種資料模型以完成對多種多樣型別管理的需求。 

字典表dictionary                 

欄位名           型別               是否可空    中文名         描述 
dict_name    varchar(50)    no          字典名字     
dict_value    int                   no          字典值           固定的,不變的 


字典資料表dictionarydata                 

欄位名                 型別              是否可空        中文名               描述 
id                       int                 no                                        自增長 
dict_value          int                 no               dictionary中的值     
dictdata_name   varchar(50)  no               字典名字     

dictdata_value   varchar(5)     no               字典值                 固定的,不變的 
isfixed                int                 no               是否固定             0預設為不固定,1固定;固定就不能再去修改了。 

說明:dictionary中的dict_value和dictionarydata中的dictdata_value都是新增完不可變的,其它表的型別欄位存取的是dictionarydata 
中的dictdata_value,在查詢關聯時,需要新增dict_value的約束(注:有人習慣存取dictionarydata中的ID,這樣在查詢時可以少 

加dict_value的約束。但是在系統的升級,或錯誤刪除dictionarydata表時,後果將是空難性的,並且存取dictdata_value主表的型別欄位 
簡單明瞭,立即可以知道它是什麼型別,所以建議存取dictdata_value)。 

表擴充套件:對於現有的設計,如果需要型別資料需要簡單的樹形結構,可以在dictionarydata可新增parent_id;如果需邏輯刪除資料時,可以 
新增iscancle; 

最後,在程式中最好再建立兩個類dictionary、dictionarydata裡面定義整型變數對應於dict_value和dictdata_value值,這樣在程式中就 

可以通過程式碼來引用型別資料。

在 應用開發中,總會遇到許多資料字典項,比如物件狀態、物件型別等等,這些項一般都是固定的若干可選值選項,比如物件狀態可能有新建、修改、刪除等狀態,這 些資料字典項一旦定義完畢改動的頻率非常低;在應用開發中,為了處理方便,一般要對這些資料字典項值選項進行數字編碼(例如: 0表示新建,1表示修改,2表示刪除等),以方便應用程式中使用。而UI顯示物件資訊時不能顯示物件狀態等的編碼,對於編碼值設計人員知道代表什麼意思,但使用者就不明白了,所以需要進行編碼轉換,從編碼轉換為文字描述(名稱),也就是需要把狀態編碼0轉換為“新建”,把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;

caseCODE_USERINF_TECHELEVEL_CJ :

strReturn = CODE_USERINF_TECHELEVEL_CJ_KEY;

break;

caseCODE_USERINF_TECHELEVEL_WJ :

strReturn = CODE_USERINF_TECHELEVEL_WJ_KEY;

break;

}

return strReturn;

}

這個方法實現了通過資料字典項編碼獲得資料字典項名稱的功能。那麼還需要實現一個對應的方法,getCodeByName(String name),即通過資料字典項名稱獲取資料字典項編碼功能(程式碼這裡省略,請讀者自己完成)。這樣就可以實現資料字典項編碼和名稱的相互轉換。

但是一旦出現數據字典項名稱或編碼需要更改(“無職稱”項編碼需要由“4”改為“0),或增加減少資料字典項,都需要更新java檔案程式碼。是否有簡便的方法在滿足上述需求的情況下又不更新java檔案程式碼?答案是肯定的。下面我們來介紹兩種實現方法:一中使用xml檔案,一種在資料庫定義。

二、在xml檔案中定義

第一種方案是應用xml配置檔案來定義資料字典項。使用xml配置檔案,以便最大限度的減小維護的工作量,避免java程式碼的頻繁修改。

下面我們分步驟詳細介紹一下使用xml配置檔案的實現方案

第一步:定義xml資料字典項配置檔案

首先新建一個xml檔案,命名為DataDictionaryConfig.xml(名字可以自己定義),把應用的用到的資料字典項分組定義到xml檔案中,舉例如下,我們定義了下列資料字典項:

<?xml version="1.0" encoding="GB2312"?>

<data-dictionaries>

<data-dictionary>

<group value = "0" name="ObjectStatus">

<option value="0" name="detached"/>

<option value="1" name="new"/>

<option value="2" name="updated"/>

<option value="3" name="deleted"/>

</group>

<group value = "1" name="ObjectTypes">

<option value="0" name="物件型別選項0"/>

<option value="1" name="物件型別選項1"/>

<option value="2" name="物件型別選項2"/>

<option value="3" name="物件型別選項3"/>

<option value="4" name="物件型別選項4"/>

</group>

</data-dictionary>

</data-dictionaries>

這個xml檔案可以根據需要進行擴充套件,滿足更復雜應用的需要。

第二步,定義資料字典項物件類和資料字典項分組物件類:

對於資料字典項這裡我們定義了一個數據字典項物件類,一組資料字典選項集我們定義了一個數據字典項分組物件類,如下:

1)、資料字典項類:

public class DataDictionaryItem

{

public DataDictionaryItem()

{

}

private String code;

private String name;

public void setCode(String code)

{

this.code = code;

}

public String getCode()

{

return this.code;

}

public void setName(String name)

{

this.name = name;

}

public String getName()

{

return this.name;

}

}

2)、資料字典項分組類

public class DataDictionaryItems

{

public DataDictionaryItems()

{

}

//資料字典項分組編碼

private String groupCode;

//資料字典項分組名稱

private String groupName;

//資料字典項詳細

private java.util.ArrayList items;

public void setGroupCode(String code)

{

this.groupCode = code;

}

public String getGroupCoude()

{

return this.groupCode;

}

public void setGroupName(String name)

{

this.groupName = name;

}

public String getGroupName()

{

return this.groupName;

}

//設定資料字典項

public void setDataDictionaryItem(DataDictionaryItem item)

{

if(this.items == null)

this.items = new java.util.ArrayList();

this.items.add(item);

}

//設定資料字典項

public void setDataDictionaryItem(String itemName, String itemCode)

{

if(this.items == null)

this.items = new java.util.ArrayList();

DataDictionaryItem item = new DataDictionaryItem();

item.setCode(itemCode);

item.setName(itemName);

this.items.add(item);

}

//獲得資料字典項組物件

public java.util.ArrayList getDataDictioanryItems()

{

return this.items;

}

第三步,定義Xml資料字典項配置檔案解析類,這裡我們使用Dom4J,相應的jar可以在http://www.dom4j.org/上找到

import org.dom4j.*;

import org.dom4j.io.*;

import java.util.*;

public class XMLDDItemParser {

//資料字典項結構

public static DataDictionaryItems dataItems ;

private static String GROUP_NAME = "name";

private static String GROUP_CODE = "value";

private static String ITEM_NAME = "name";

private static String ITEM_CODE = "value";

public XMLDDItemParser() {

}

/**

獲得分組資料字典項集

@param groupName String

@return DataDictionaryItems

*/

public static DataDictionaryItems getDataDictionaryItems(String groupName)

{

if(dataItems == null)

dataItems = parseXML(groupName);

return dataItems;

}

/**

根據分組名稱解析xml檔案,獲得該分組下資料字典項集

@param gName String

@return DataDictionaryItems 資料字典項分組物件

*/

public static DataDictionaryItems parseXML(String gName)

{

try

{

org.dom4j.io.SAXReader saxReader = new org.dom4j.io.SAXReader();

Document document = saxReader.read("DataDictionaryConfig.xml");

dataItems = new DataDictionaryItems();

List list = document.selectNodes("//group");

Iterator iter = list.iterator();

while (iter.hasNext())

{

Node node = (Node) iter.next();

if (node instanceof Element)

{

//document

Element element = (Element) node;

String GroupName = element.attributeValue(GROUP_NAME);

String GroupValue = element.attributeValue(GROUP_CODE);

//設定分組名稱編碼

dataItems.setGroupName(GroupName);

dataItems.setGroupCode(GroupValue);

//取組內資料字典項

if (gName.equals(GroupName))

{

//取資料字典項名稱編碼

Iterator elemIter = element.elementIterator();

while (elemIter.hasNext())

{

Element elem = (Element) elemIter.next();

dataItems.setDataDictionaryItem(elem.attributeValue(ITEM_NAME), elem.attributeValue(ITEM_CODE));

}

}

}

}

}

catch (Exception ex) {

ex.printStackTrace();

}

return dataItems;

}

第四步,提供資料字典項編碼轉換方法類:

public class DataDictionaryUtils {

public DataDictionaryUtils() {

}

/**

根據資料項名稱轉換為資料項編碼

@param groupName String

* @param itemName String

* @return String資料項編碼

*/

public static String getItemCode(String groupName, String itemName)

{

String code = "-1";

DataDictionaryItems dataItems = XMLDDItemParser.getDataDictionaryItems(groupName);

java.util.ArrayList items = dataItems.getDataDictioanryItems();

if(items != null)

{

DataDictionaryItem item;

for(int i = 0; i < items.size(); i++)

{

item = (DataDictionaryItem) items.get(i);

if(item != null)

{

String name = item.getName();

if(name.equals(itemName))

{

code = item.getCode();

break;

}

}

}

}

return code;

}

/**

根據資料項編碼轉換為資料項名稱

* @param groupName String

* @param itemCode String

* @return String

*/

public static String getItemName(String groupName, String itemCode)

{

String name = "未知";

DataDictionaryItems dataItems = XMLDDItemParser.getDataDictionaryItems(groupName);

java.util.ArrayList items = dataItems.getDataDictioanryItems();

if (items != null)

{

DataDictionaryItem item;

for (int i = 0; i < items.size(); i++)

{

item = (DataDictionaryItem) items.get(i);

if (item != null)

{

String code = item.getCode();

if (code.equals(itemCode))

{

name = item.getName();

break;

}

}

}

}

return name;

}

至此,我們已經完成了該方案的設計。使用xml檔案,增加刪除資料字典項等只需要更新xml檔案即可,不涉及java檔案的更新。

Xml可以根據應用的具體需要進行擴充套件設計。這裡僅僅拋磚引玉,提供一種思路。

三、使用資料庫表

上一種方法我們使用xml檔案定義資料字典項,現在我們把資料字典項定義在資料庫表中,下面我們來詳細介紹實現方式:

第一步:定義資料字典項資料表結構

根據前面xml檔案定義,這裡我們定義兩張表,一張是資料字典分組資訊表,一張是資料字典項詳細資訊表。如下:

drop table datadic_groups;
create table datadic_groups(
group_code varchar2(
20
) primary key,
group_name varchar2(
50

);

drop table datadic_items;
create table datadic_items(
dataitem_code varchar2(
20
) primary key,
dataitem_name varchar2(
50
),
group_code varchar2(
20
)
);

alter table datadic_items 
add constraint dataitem_foreignkey foreign key (group_code) 
references datadic_groups(group_code);

這兩張表可以根據應用的具體需求進行擴充,這裡不再贅述。

第二步:根據定義的資料字典表結構定義資料字典實體類。

(請參照二、在xml檔案中定義的第二步)

第三步:實現資料庫表中資料字典項的查詢功能

/**

實現從資料庫查詢資料字典項

* @param gName String

* @return DataDictionaryItems

*/

public static DataDictionaryItems getFromDB(String gName)

{

dataItems = new DataDictionaryItems();

try

{

//獲取資料連線

java.sql.Connection conn = getConnection();

if(conn != null)

{

//查詢資料庫,根據組名稱查詢組編號,根據組編號獲取該組內資料字典項資訊

String strSql = "select items.dataitem_code, items.dataitem_name, items.group_code, dgroups.group_name from datadic_items items, datadic_groups dgroups where items.group_code = dgroups.group_code and dgroups.group_name='"+gName+"'";

java.sql.Statement stmt = conn.createStatement();

java.sql.ResultSet rs = stmt.executeQuery(strSql);

while(rs.next())

{

String dataitem_code = rs.getString(1);

String dataitem_name = rs.getString(2);

dataItems.setDataDictionaryItem(dataitem_name, dataitem_code);

String group_code = rs.getString(3);

String group_name = rs.getString(4);

dataItems.setGroupCode(group_code);

dataItems.setGroupName(group_name);

}

}

}

catch(Exception ex)

{

ex.printStackTrace();

}

return dataItems;

}

第四步:提供資料字典項編碼轉換方法類:

(請參照二、在xml檔案中定義的第四步)

四、進一步完善

1、兩種方式都可以提供資料字典項維護介面,直接在維護介面上操作資料字典項,避免由於誤操作導致xml檔案或資料庫資料錯誤。具體的實現也是比較簡單,不再詳細說明。

2、 使用資料庫表方式時,如果想減少頻繁查詢資料庫,可以將資料字典項資訊在系統啟動後第一次訪問時載入記憶體中,如果資料字典項資料量比較大,可實現一自維護 執行緒,採用最近最少使用演算法,將頻繁使用的資料字典項駐留記憶體,將長期不用的資料字典項從記憶體中刪除,每次自動檢查記憶體中的資料字典項,如果存在則從記憶體 中讀取,如果不存在則查詢資料庫,替換記憶體中最少使用的資料字典項。

相關推薦

資料庫字典設計

在稍大一些的專案中,我們總是需要管理各種各樣的型別型別資料(如商品型別、遊戲型別。。。)。對於這些型別的管理類似,如果為每 一種型別都建立一張表去維護(而在專案中,正常出現50種類型),那工作量是可想而之大,並且我們不得不去了解每一個型別表的名字, 以去關聯它。    因此,我們需要一種資料模型以完成對多種多

資料庫mysql設計的三大規範

2018年5月22日a  所有欄位值都是不可分解的原子值b  也就是說在一個數據庫表中,一個表中只能儲存一種資料,不可以把多種資料儲存在同一張資料庫表中c   資料表中的每一列資料都和主鍵直接相關,而不能間接相關1.第一正規化(確保每列保持原子性)第一正規化是最基本的正規化。

SQL SERVER 資料庫匯出設計

參考文章:https://jingyan.baidu.com/article/27fa73269e3ef046f9271f79.html 當我們需要重複利用某個表的表結構設計,或者是想刪除整個資料庫中的資料,快速建立新的空值資料庫時,會考慮到把表設計匯出為指令碼進行使用,便於共享傳遞,並支援不同

淺談資料庫設計的幾個原則

對於資訊管理類的程式來說,一個系統就是一個資訊庫。在大量的資訊中為了索引、區別,最好的辦法就是用資料庫。然而建立一個簡潔、高效、全面的資料庫卻並不簡單。一個優秀的資料庫無疑能夠幫助程式設計師減少業務邏輯操作,減少出錯的可能性;而一個糟糕的資料庫設計會在需要新增功能的時候無

資料庫擴充套件設計過程記錄

  這兩天需要實現一個動態表單設計,面對著屬性的不確定,要能夠容納不同的屬性進來,之前也接觸過這方面的設計,但是沒有設計好,導致問題太多,這一次參考一些前輩們的經驗後,再次嘗試一番,通過動態設計表結構,以達到任務要求。   一、常用動態表結構設計方式   1、動態修改表,適應變化。   2、

系統資料字典結構設計

CREATE TABLE `g_sys_dict` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', `pid` int(11) DEFAULT '0' COMMENT ' 父ID ', `data_type` varchar(50)

Oracle資料庫設計時的注意事項

表是Oracle資料庫中最基本的物件之一。萬丈高樓從平地起,這個基礎物件對於資料庫來說,非常重要。因為其設計是否合理,直接跟資料庫的效能相關。從Oracle資料庫菜鳥到資料庫專家這個過程中,在表設計與管理上,或多或少,會犯一些錯誤。筆者今天就談談自己在這方面的經驗與教訓,或許能夠給大家一些警

資料庫設計的大忌.

很多的程式設計師,總是會犯這種錯誤..導致後來系統越來越爛.. 越來越爛,基本上都是這幾個原則沒有把握住. 第一個大忌,懶, 不想新增欄位, 使用已有欄位存放新的資料. 舉個例子, 客戶姓名, 客戶代號,客戶ID, 可能有的系統設計的時候,只有客戶姓名和客戶ID, 沒有客戶代號.

常見電商專案的資料庫設計(MySQL版)

簡介: 目的: 電商常用功能模組的資料庫設計 常見問題的資料庫解決方案 環境: MySQL5.7 圖形客戶端,SQLyog Linux 模組: 使用者:註冊、登陸 商品:瀏覽、管理 訂單:生成、管理 倉配:庫存、管

MySQL資料庫聯合設計模擬選課系統

使用dtest資料庫 建立學生表t4_stu create table t4_stu(sid int auto_increment, sname varchar(64) not null, sphonum int(20) not null, primary key(sid))engine=inn

商城 商品模組 資料庫 設計

要實現一個商城,對於商品模組中的資料庫表設計不懂,主要是:相同類別的產品的產品引數相同,不同類別的不同,這裡就不懂要怎麼設計了,所以上網找幾篇部落格瞭解   什麼是SPUSKUARPU PHP商城 商品模組 資料庫 表設計

人人商城資料庫字典---分銷提現

人人商城資料庫字典—分銷提現表(commission_apply) 欄位名 功能 id uniacid applyno

人人商城資料庫字典---使用者

人人商城資料庫字典—使用者表 ims_ewei_shop_member 欄位名 功能 id uniacid uid 在 mc_

關係型資料庫中常用的設計

1.字典表(sys_dict) 作用:用於存放多組值不變的基礎資料,只對系統提供查詢功能. *記錄的新增、更新、刪除都是通過手動進行操作. *其中dict_code為dict_title的編碼,相同dict_title的記錄為同一組基礎資料,每組基礎資料下又有多對dict_value與d

基於java的收藏排行功能之五:Dao層對資料庫的操作&資料設計

接上一篇 11:dao介面 package cn.itcast.travel.dao; import cn.itcast.travel.domain.Route; import java.util.List; public interface RouteDao { public

資料庫】Mysql中主鍵的幾種設計組合的實際應用效果

寫在前面         前前後後忙忙碌碌,度過了新工作的三個月。部落格許久未新,似乎對忙碌沒有一點點防備。總結下來三個月不斷的磨礪自己,努力從獨樂樂轉變到眾樂樂,體會到不一樣的是,連辦公室的新玩意都能引起莫名的興趣了,作為一隻忙碌的 “猿” 倒不知正常與否。         咳咳, 正題, 今天要寫一篇

資料庫設計的幾條準則

前言:資料庫設計在平時的工作是必不可少的,良好的表設計可以讓我們查詢效率更高,加快網站訪問速度,提升使用者體驗,並且方便於我們查詢資料。本篇部落格就來聚焦一下,如何設計出高可複用,優良的表結構,從而在實際的工作中使我們寫出更好的程式碼。 資料庫表設計的幾條黃金準則: 一:欄位的原子性 解

無限級分銷系統資料庫設計

   這次分享的內容很簡單,就是一張表的設計思路。 一、背景 在做交易所的時候有個需求,需要統計邀請註冊人數,比如 A邀請B, B邀請C, C邀請D。那麼A的邀請人數就是3個,B的邀請人數就是2個,C的邀請人數就是1個。除此之外,還要能統計出A直接邀請人數,A下一級邀請人數,A下二級

訂單審批流程 資料庫設計

1、應用場景 訂單生成時,加入訂單稽核流,不同的審批級別全部通過稽核之後,才能對訂單進行後續的操作 2、審批型別表 欄位名稱 欄位型別 欄位長度 主鍵 非空 註釋 APPROVALCODE VARCHAR2 2 Y NOT NULL 審批型別編碼

百度筆試題--論壇資料庫設計

轉載地址:http://blog.sina.com.cn/s/blog_542a862901000cbq.html 二、 一個簡單的論壇系統,以資料庫儲存如下資料:   使用者名稱,email,主頁,電話,聯絡地址,發帖標題,發帖內容,回覆標題,回覆內容。   每天論壇訪問量300萬