================================================================================================================================sql
字典表設計及應用舉例 爲了響應志峯兄弟的需求,今天抽了點時間寫點關於字典表設計的東西,順便結合一個小的應用對設計作個用例體驗。
咱先來看看什麼叫字典。
時間緊張,先略了,之後再談呵呵
字典存在的必要性及他的好處。
同上^_^
字典設計思路。
字典信息在系統中充當基礎參數的角色,基本上有些重要的基本信息是要在系統在爲正式業務服務以前就由系統管理員維護進去的,有的字典信息是在使用過程當中由系統管理員或者其餘用戶維護進去的。數據庫
也就是說,咱們有「維護字典信息」的需求,那麼咱們在設計字典信息表結構的時候就要考慮到這個需求。
在維護的時候,咱們確定但願能對字典信息分文別類的進行維護,這樣咱們須要設計一個字典類類別表(Dic_Type),結構以下:
ID(字典類型ID)
Name(字典類型名稱)post
具體表數據特徵請看下面的例子。
有了類別表後,咱們還須要一個存放每一個類別的字典信息的具體數據表(Dic_Data):\性能
ATID(自動增加的ID,沒有實際做用)
TypeID(字典信息歸屬的字典類別ID)
ID(字典信息ID,在程序中使用的字典ID就是這個)
Name(字典信息內容)設計
這樣,在咱們的業務信息表中,存放的和字典相關的字段的值就是Dic_Data中的ID的值,那麼就涉及到在界面上顯示信息的問題,若是不作處理,顯示出來的確定就是原始的字典信息的ID,確定不是用戶但願獲得的,基於這個需求,
咱們爲每一個類型的字典信息作一個視圖(具體方法見後面的例子),
將信息表與對應的視圖作關聯查詢就能夠獲得字典信息ID對應的真正內容。it
應用舉例。
假定作一個學生信息管理系統
字典類型表設計以下(Dic_Type):
ID Name
1 Sex
2 ...io
字典內容表設計以下(Dic_Data):
ATID TypeID ID Name
1 1 1 男
2 1 2 女
3 2 1 ...
4 2 2 ...
5 2 3 ...
6 2 4 ...
... ... ... ...基礎
性別類型字典的視圖(VW_Sex):
select ID,Name from Dic_Data where TypeID=1select
假設學生信息表以下T_Student:
ID Name ... Sex
1 采采 ... 1
2 花花 ... 2
3 剛剛 ... 1sql語句
取學生列表信息可經過以下方法實現:
select T_Student.ID as StudentID,T_Student.Name as StudentName,VW_Sex.Name as SexName
from T_Student left join VW_Sex on T_Student.Sex=VW_Sex.ID
結果以下:
StudentID StudentName SexName
1 a 男
2 b 女
3 c 女
時間倉促,寫的粗糙了點,還請見諒,有時間再補充。。。
綠色通道:好文要頂關注我收藏該文與我聯繫
================================================================================================================================
咱們如今在進行數據庫字典表設計時,有二種方式,其一是傳統的方式,每一個字典表都有ID、Name兩字段。第二種方式是將全部字典表的數據放在同一張表中,結構以下:
TypeTable(typeID,typeName)【主表,用來記錄字典表表名信息】;DataTable(typeID,DataId,DataName)【從表,記錄全部字典表數據信息】
如性別、婚姻狀態,在TypeTable中是兩條記錄,{02,性別},{06,婚姻狀態};而在DataTable中各有三條記錄{02,0,女 / 02,1,男 / 02,9,其它},{06,0,未婚 / 06,1,已婚 / 06,9,離異}
另有一張病人列表patient(patientID,SexID,MarryStatusID…)
如今須要查詢病人信息,sql語句以下:
Select b.DataName as SexName,c.DataName as MarryStatusName
from patient a left join DataTable b on b.DataId=a.SexID and b.typeID=’02’
left join DataTable c on c.DataId=a.MarryStatusId and b.typeID=’06’
在數據庫中執行該Sql語句,因爲DataTable約1000條左右的數據量,相對第一種方式必將對數據庫有必定的影響。
(固然在實際業務中可能相似的字典表約達5-10個,patient的數據量約500w條)
但不知道在一個系統中全部字典表獲取數據都採用這種方式對數據庫性能到底影響到什麼程度,約下降百分之幾的性能?會有其它隱患沒?
================================================================================================================================
樓上的可能沒明白樓主的意思。
不是指學歷表和國籍表數據量大,而是指人員表所具備的屬性可能太多(這裏不必定指人員表,也多是其它的實體,即隨着系統的複雜程度增長,實體的屬性增長)。這裏以人員爲例,說了國籍和學歷兩個屬性,若是人員還有職位,那麼必然多出職位表,若是還有其它...
那即,當取得一條實例的徹底數據時,那將進行幾十個表的join,樓主考濾的應該是這個問題。
person_info(person_id,name,country_id,education_id,position_id,....)
country(country_id,name,...)
position(position_id,name,...)
education(education_id,name,....)
...
因此樓主採用了另外一種設計方式: 全部屬性類(屬性自己也是實體,只不過是主表的某個屬性)放置在一個表中,用屬性名和屬性值來區別。 persion_info(persion_id,name,...) 1 aaa 2 bbb attributes(attributes_id,persion_id,attributes_name,attributes_value) 1 1 country china 2 1 education 小學 3 1 position 公司總裁 4 2 country usa 5 2 education 碩士 6 2 postion DBA