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