摘要:隨著互聯(lián)網(wǎng)的發(fā)展,基于關(guān)系型數(shù)據(jù)庫開發(fā)應(yīng)用系統(tǒng)的方式得到了廣泛的應(yīng)用。本文闡述了樹型結(jié)構(gòu)的特點,討論了在關(guān)系型數(shù)據(jù)庫中基于路徑表示法與雙親表示法相結(jié)合的方式的將樹型結(jié)構(gòu)設(shè)計方案,并提出了在.net平臺下利用Treeview控件顯示樹型結(jié)構(gòu)數(shù)據(jù)的具體實現(xiàn)方法。
關(guān)鍵詞:樹型結(jié)構(gòu);Treeview控件
中圖分類號:TP311.52 文獻(xiàn)標(biāo)識碼:A 文章編號:1007-9599 (2012) 17-0000-02
1 引言
在樹型結(jié)構(gòu)中,根節(jié)點沒有前驅(qū)節(jié)點,其他節(jié)點均有一個前驅(qū)節(jié)點,葉子節(jié)點沒有后續(xù)節(jié)點,其他節(jié)點均有一個或多個后續(xù)節(jié)點,其核心就是數(shù)據(jù)元素之間一對多的關(guān)系,比如設(shè)備管理、組織結(jié)構(gòu)等。然而在關(guān)系型數(shù)據(jù)庫中,表是以行和列的形式組織起來的數(shù)據(jù)集合,表的每一行是一個數(shù)據(jù)元素,數(shù)據(jù)元素之間呈線性排列,彼此間沒有關(guān)系,在各種基于關(guān)系型數(shù)據(jù)庫開發(fā)的應(yīng)用系統(tǒng)中,我們往往要存儲像組織結(jié)構(gòu)這樣的樹型結(jié)構(gòu)的數(shù)據(jù),數(shù)據(jù)元素之間存在著一對多的關(guān)系,將具有樹型結(jié)構(gòu)的數(shù)據(jù)元素簡單的呈線性排列是無法體現(xiàn)數(shù)據(jù)元素之間的關(guān)系,如何在關(guān)系型數(shù)據(jù)庫中設(shè)計樹型數(shù)據(jù)結(jié)構(gòu)并有效應(yīng)用,是我們要解決的問題。
2 數(shù)據(jù)結(jié)構(gòu)設(shè)計
2.1 路徑表示法
路徑表示法是將從根節(jié)點到節(jié)點的路徑記錄下來,每條記錄中的路徑字段表明了節(jié)點在樹中的層次關(guān)系,如表一。equipmentType列記錄設(shè)備類型,path列記錄設(shè)備類型路徑。路徑表示法優(yōu)點在于查詢方便,不受樹深度的影響,缺點在于要修改某一節(jié)點在樹中的隸屬關(guān)系時需要維護(hù)路徑,這樣做非常麻煩。
2.2 雙親表示法
雙親表示法用兩個字段來表示一個節(jié)點在樹中的隸屬關(guān)系,如表二。equipmentType列記錄設(shè)備類型,equipmentTypeParent列父記錄設(shè)備類型。雙親表示法的優(yōu)點在于修改某一節(jié)點在樹的隸屬關(guān)系比較方便,只需要修改父節(jié)點信息既可,缺點在于查詢單一節(jié)點信息方便,但是查詢某一父節(jié)點下的所有子節(jié)點信息需要遞歸查詢。
2.3 兩者結(jié)合
可以利用數(shù)據(jù)冗余將上述兩種方案結(jié)合,如表三。這樣可以在一張數(shù)據(jù)表中實現(xiàn)無限級的動態(tài)層次關(guān)系,當(dāng)樹的深度增加時,無需修改表結(jié)構(gòu),只需增加相關(guān)記錄即可,同時也保證了數(shù)據(jù)結(jié)構(gòu)的穩(wěn)定性。
3 操作界面設(shè)計
隨著數(shù)據(jù)量的增加,僅在數(shù)據(jù)庫中維護(hù)數(shù)據(jù)會逐漸繁瑣。TreeView控件專門用來顯示信息的分級視圖,如同Windows里的資源管理器的目錄,TreeView控件中的各項信息都有一個與之相關(guān)的Node對象,基于Treeview控件的特性,在這里介紹一種在.net平臺下利用Treeview控件對樹型結(jié)構(gòu)數(shù)據(jù)進(jìn)行展示和數(shù)據(jù)維護(hù)的方法。圖一為數(shù)據(jù)維護(hù)界面。
界面左側(cè)為設(shè)備類型樹,圖二為Treeview控件的示例代碼。程序初始化時,可以將已經(jīng)設(shè)計好的數(shù)據(jù)表中的設(shè)備信息集合作為Treeview控件的數(shù)據(jù)源,當(dāng)在樹中點擊任意設(shè)備類型時,右側(cè)將顯示此設(shè)備的詳細(xì)信息,這一點在選擇改變事件中可以用簡單代碼實現(xiàn)。數(shù)據(jù)初始化與選擇改變事件關(guān)鍵代碼如下:
using System.Windows.Controls;
public partial class mobileEquipmentTypeTreeManage : UserControl
{
dataformService ser = new dataformService();
public mobileEquipmentTypeTreeManage()
{
InitializeComponent();
elementTypeTree elementTypeTree;
ser.getMobileEquipmentTypeTree(out elementTypeTree);
mobileEquipmentTypeTreeView.ItemsSource = new List
……
}
private void mobileEquipmentTypeTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs
{
elementTypeTree elementTypeTree = mobileEquipmentTypeTreeView.SelectedItem as elementTypeTree;
if (elementTypeTree != 1)
{
this.mobileEquipmentTypeTextBox.Text = elementTypeTree.current.type;
……
}
}
……
}
4 數(shù)據(jù)維護(hù)
基于數(shù)據(jù)結(jié)構(gòu)設(shè)計采用路徑表示法與雙親表示法相結(jié)合的方式,在這里只對數(shù)據(jù)維護(hù)要注意的事項進(jìn)行說明。
4.1 增加節(jié)點
(1)父節(jié)點必須存在,可以在樹中選擇任意節(jié)點作為父節(jié)點。(2)新增節(jié)點路徑 = 父節(jié)點路徑 + 新增節(jié)點名稱。(3)新增節(jié)點在樹中不能已經(jīng)存在。
4.2刪除節(jié)點
(1)要刪除的節(jié)點是否有子節(jié)點,如果有需先刪除子節(jié)點。
4.3修改節(jié)點
(1)修改后的父節(jié)點必須是存在于樹中。(2)要修改的節(jié)點不能為父節(jié)點。(3)修改后的節(jié)點路徑 = 修改后的父節(jié)點路徑 + 修改后的節(jié)點名稱
5 結(jié)束語
本文討論的樹型結(jié)構(gòu)設(shè)計方法,利用了數(shù)據(jù)冗余減少了數(shù)據(jù)表的數(shù)量,相對的增加了數(shù)據(jù)結(jié)構(gòu)的穩(wěn)定性,樹的深度不受限制。對單條數(shù)據(jù)維護(hù)不會破壞樹結(jié)構(gòu),與以往在數(shù)據(jù)庫中使用SQL語句維護(hù)數(shù)據(jù)相比,操作相對簡便易懂。此方案已經(jīng)成功應(yīng)用于本單位的生產(chǎn)系統(tǒng)和車輛調(diào)度系統(tǒng)。
參考文獻(xiàn):
[1]Tom Archer,Andrew Whitechapel. C#技術(shù)揭秘.北京:機(jī)械工業(yè)出版社,2003.07
[2]鄧宏濤.關(guān)系數(shù)據(jù)庫中樹型結(jié)構(gòu)信息的處理方法研究[A]. 江漢大學(xué)學(xué)報(自然科學(xué)版),2010,38(02):50-53