當前位置:首頁 » 操作系統 » 樹形結構資料庫設計

樹形結構資料庫設計

發布時間: 2023-08-20 21:21:20

1. 資料庫中樹形圖的用法

資料庫中樹形圖的用法的用法你知道嗎?下面我就跟你們詳細介紹下資料庫中樹形圖的用法的用法,希望對你們有用。

資料庫中樹形圖的用法的用法如下:

樹形圖用於顯示按照樹形結構進行組織的數據,其用途比較廣泛,如計算機中的文件系統(Windows中的資源管理器)、企業或公司的組成結構等。我們知道在Windows下VB、PB、Delphi等工具提供了一個功能很強的樹型控制項TreeView,利用Treeview控制項可以方便地開發樹形圖。然而在網頁上實現樹形圖就不那麼容易了,現在在asp.net中利用微軟提供的Internet Explorer WebControls它使得網頁上的樹形圖開發與在Windows下一樣的方便,一樣的功能強大,甚至更靈活。

本文介紹用Internet Explorer WebControls開發樹形圖的方法,由於樹形圖結構較復雜,使用起來常不知如何下手。筆者結合最近剛為公司用ASP.NET編寫的應用程序管理器這一具體實例,詳細闡述在ASP.NET下如何將Internet Explorer WebControls的使用與資料庫聯系起來,實現數據分任意多層顯示,方便地進行增加、修改、刪除、移動操作。筆者希望通過對該實例的闡述,達到拋磚引玉的效果,與各位同仁相互交流,共同進步。

Internet Explorer WebControls不在VS.NET的標准Server Control中,要到微軟的站點上下載,下載地址是:

http://msdn.microsoft.com/downloads/samples/internet/default.asp?url=/Downloads/samples/Internet/ASP_DOT_NET_ServerControls/WebControls/default.asp

下載安裝後第一次使用時,要右擊工具箱Customize Toolbox…→.NET Framework Components中找到Micosoft.Web.UI.WebControls.Treeview後選中,這樣Treeview控制項就出現在工具箱中了。

一、樹的建立

具體方法是:創建一個資料庫,設計樹圖信息表TREE_INFO,包含NODEID、PARENTID、NODENAME、ADDErss、ICON欄位,其它欄位根據實際業務而定,節點名稱NODENAME將在樹型控制項的節點上顯示,NODEID欄位保存節點的唯一標識號,PARENTID表示當前節點的父節點號,標識號組成了一個“鏈表”,記錄了樹上節點的結構。設計一個Web窗體其上放置TreeView控制項。

PRivate Sub CreateDataSet()’建立數據集

Dim myConn As New sqlConnection()

Dim myCmd As New SqlCommand("select NODEID,NODENAME,PARENTID,ADDRESS,ICON from Tree_info", myConn)

Dim myDataAdapter As New SqlDataAdapter()

myConn.ConnectionString = application("connectstring")

myCmd.CommandText = ""

myCmd.Connection = myConn

myDataAdapter.SelectCommand = myCmd

myDataAdapter.Fill(ds, "tree")

End Sub

建樹的基本思路是:從根節點開始遞歸調用顯示子樹

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

CreateDataSet()

intiTree(TreeView1.Nodes, 0)

End Sub

Private Sub intiTree(ByRef Nds As TreeNodeCollection, ByVal parentId As Integer)

Dim dv As New DataView()

Dim drv As DataRowView

Dim tmpNd As TreeNode

Dim intId As Integer

dv.Table = ds.Tables("tree")

dv.RowFilter = "PARENTID=’" & parentId & "’"

For Each drv In dv

tmpNd = New TreeNode()

strId = drv("NODE_ID")

tmpNd.ID = strId

tmpNd.Text = drv("NODE_NAME ")

tmpNd.ImageUrl = drv("ICON").ToString

Nds.Add(tmpNd)

intiTree(Nds(Nds.Count - 1).Nodes, intId)

Next

End Sub

二、增加、刪除樹節點

單純在Treeview 上增加、刪除、修改節點只需用Nodes屬性的Add、 Remove、等方法即可,值得注意的地方是VS.NET中Treeview的Nodes集合與VS6.0中的區別,VS6.0中的是一個大的集合,而VS.NET中的是分層的每個Node下都有Nodes屬性。增加、刪除、修改樹節點時與VS6.0相比有很大差別,特別是刪除時。

Private Sub ButAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButAdd.Click’在選定的節點下添加子節點

Dim tmpNd As New TreeNode(), NdSel As TreeNode

tmpNd.ID = GetNewId()

NdSel = TreeView1.GetNodeFromIndex(TreeView1.SelectedNodeIndex)’選中的節點

tmpNd.Text = "新節點"

NdSel.Nodes.Add(tmpNd)

Dim myRow As DataRow

myRow = ds.Tables("tree").NewRow()

myRow("NODE_NAME") = tmpNd.ID

myRow("NODE_DESCRipT") = "新節點" & tmpNd.ID & "_" & NdSel.ID

myRow("PARENT_NAME") = NdSel.ID

ds.Tables("tree").Rows.Add(myRow)

End Sub

Private Sub ButDele_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButDele.Click’刪除選中的節點

Dim idx As String = TreeView1.SelectedNodeIndex()

GetNdCol(idx).Remove(TreeView1.GetNodeFromIndex(idx))

Dim dv As New DataView(), recNo As Integer

dv.Table = ds.Tables("tree")

dv.RowFilter= "NODEID=" & NdId

dv.Delete(0)

End Sub

Private Function GetNdCol(ByVal idx As String) As TreeNodeCollection

‘獲得選中節點的父節點的Nodes集合

Dim cnt As Integer, i As Integer

Dim tmpNds As TreeNodeCollection

Dim idxs() As String

idxs = Split(idx, ".")

cnt = UBound(idxs)

If cnt = 0 Then

tmpNds = TreeView1.Nodes

Else

tmpNds = TreeView1.Nodes(CInt(idxs(0))).Nodes

For i = 1 To cnt - 1

tmpNds = tmpNds(CInt(idxs(i))).Nodes

Next

End If

Return tmpNds

End Function

三、修改、移動樹節點

由於伺服器控制項不支持滑鼠拖動事件,所以不能象Windows程序那樣通過拖動移動節點,這里是通過選擇父節點的方式。移動是通過在原位置刪除,新位置添加實現的,要注意在刪除時先保存節點信息。

Private Sub TreeView1_SelectedIndexChange(ByVal sender As Object, ByVal e As Microsoft.Web.UI.WebControls.TreeViewSelectEventArgs) Handles TreeView1.SelectedIndexChange

Dim dv As New DataView()

dv.Table = ds.Tables("tree")

Dim tmpNd As TreeNode = TreeNdSel(e.OldNode), tmpNds As TreeNodeCollection

dv.RowFilter= "NODEID=" & tmpNd.ID

dv(0)("NODE_DESCRIPT") = Me.TextBox1.Text

dv(0)("ADDRESS") = Me.TextBox2.Text

dv(0)("TARGET") = Me.TextBox3.Text

dv(0)("ICON") = Me.TextBox4.Text

If dv(0)("PARENTID").ToString <> Me.DropDownList1.SelectedItem.Value Then

‘移動節點

dv(0)("PARENT_NAME") = Me.DropDownList1.SelectedItem.Value

If Me.DropDownList1.SelectedItem.Value = "ROOT" Then

tmpNds = TreeView1.Nodes

Else

tmpNds = FromIdToNode(Me.DropDownList1.SelectedItem.Value, TreeView1.Nodes).Nodes’新的父節點的Nodes集合

End If

GetNdCol(e.OldNode).Remove(tmpNd)

tmpNds.Add(tmpNd)

End If

tmpNd.Text = Me.TextBox1.Text

tmpNd.ImageUrl = Me.TextBox4.Text

tmpNd = TreeView1.GetNodeFromIndex(TreeView1.SelectedNodeIndex)

dv.RowFilter= "NODEID=" & tmpNd.ID

Me.TextBox1.Text = dv(0)("NODENAME").ToString

Me.TextBox2.Text = dv(0)("ADDRESS").ToString

Me.TextBox3.Text = dv(0)("TARGET").ToString

Me.TextBox4.Text = dv(0)("ICON").ToString

End Sub

Private Function FromIdToNode(ByVal ID As String, ByVal Nds As TreeNodeCollection) As TreeNode

‘由關鍵字查找節點

Dim i As Integer

Dim tmpNd As TreeNode, tmpNd1 As TreeNode

For Each tmpNd In Nds

If tmpNd.ID = ID Then

Return tmpNd

Exit Function

End If

tmpNd1 = FromIdToNode(ID, tmpNd.Nodes)

If Not (tmpNd1 Is Nothing) Then

Return tmpNd1

Exit Function

End If

Next

Return Nothing

End Function

2. 怎樣設計樹形目錄的資料庫用SQL

首先你要確定你所使用的DBMS產品,因為在ORACLE和SQL SERVER等DBMS的SQL語法有局部的不同,但大體上語句是一樣的。
CREATE TALBE tmpDB (
tid int identity(1,1) primary key, --表主鍵,可以不用加not null一般使用了primary key就可默認為not null
tname varchar(100) not null, --節點名稱
fatherID int --父節點ID
)
GO

生成樹形數據結構
select
*
from
table
start with id = ?
connect by prior id = ?

3. 如何在關系型資料庫中存儲樹形結構

文中使用公司部門結構樹作為栗子,要在mysql中存儲這個公司部門結構樹

鄰接表想必大家都不陌生吧,用鄰接表的關鍵是,在每個節點存儲他的父節點的id。

在每一個部門信息中都存儲了他的父節點id,parent_id欄位

導入數據的過程就不說了,直接來看下數據吧:

這里使用常用的幾種查詢方式來看下這種方案的查詢

可以通過parent_id做查詢條件,可以快速查詢到一個部門的直屬下級部門

通過部門信息中的parent_id去查相應的父節點信息就可以快速實現

這種數據存儲結構下,更新數據是比較方便快捷的,添加數據時直接找准父節點的id,組織部門變更時,也直接變更父id就好了,刪除時候,看自己業務是否需要刪除子節點這幾種情況,

路徑標的要點,就是每個節點存儲根節點到該節點的路徑,其實我覺得和別的幾種方案可以共用

在每一個部門信息中都存儲了他完整的路徑,path欄位

導入數據的過程就不說了,直接來看下數據吧:

使用路徑表,通過path這個欄位查詢起來是比較困難的,一般都需要使用like,CONCAT函數、REPLACE函數等做字元串的處理邏輯,查詢起來比較復雜,這里不做展示了,線上服務不建議使用這種方式,查詢效率低會影響到服務性能,一般建議和鄰接表方式統一使用,同時添加parent_id和path欄位,parent_id用來查詢,path用來查看節點完整的路徑

這種數據存儲結構下,更新數據是比較方便快捷的,添加數據時直接找准路徑就好,組織部門變更時,也直接找准路徑就好,刪除時候,看自己業務是否需要刪除子節點這幾種情況,

Closure Table,網路直譯過來叫閉合表,大多數人叫做閉包表,這種方案的要點是存儲公司部門信息主表中,不存儲節點關系的數據,使用另一張關系表來存儲節點之間的關系,其中包含了任何兩個有關系(上下級)節點的關聯信息

公司部門信息主表,只需要存儲部門的本身信息

主要包括三個欄位

要點就是關系表的一條記錄是一個上級節點、下級節點、與他們之間的路徑距離。拿部門結構圖來舉例子

總公司-企劃部的關系數據是:

總公司-大區A的關系數據是:

關系表中存儲所有的節點路徑信息,還用distance表示路徑的距離,需要把樹形結構中每兩個節點之間的路徑信息都維護進來。

數據存儲的過程就拿導入總公司-門店A的過程做個示例。主表的數據存儲就不說,說下關系中,存儲部門結構的路徑信息,總公司-門店A總共包含以下幾條路徑:

看到了么,是存儲了所有總公司-門店A之間的路徑信息

這里使用常用的幾種查詢方式來看下這種方案的查詢

這種數據存儲結構下,更新數據比較麻煩,因為他存儲了兩節點直接所有路徑信息(包括中間節點的)

4. sql server 2005實現樹形菜單顯示的資料庫表怎麼設計

第一種:單表。
列分別為 id、菜單名稱、子菜單id列表;

id:菜單的唯一編號
子菜單id列表:用逗號(或其他分隔符)分割的多個id的字元串,再由程序中進行處理,分割出多個id;

優點:查詢速度非常快。
缺點:不利於維護和拓展,在進行菜單項排序時需要再多寫代碼進行處理。

第二種:單表內連接。
列分別為 id、菜單名稱、父菜單id;

根節點的父菜單id為null或者0等一個可以唯一標志的。在查詢時進行表內連接查詢;

優點:利於表結構的維護和拓展,並且符合設計範式;
缺點:在查詢時會造成一些麻煩,並且性能上會受到影響。

當然還有很多其他的方法,這里只例舉2個比較常用的方法。

熱點內容
水漲船怎麼配置 發布:2025-03-10 05:49:24 瀏覽:250
安卓系統升級不動怎麼回事 發布:2025-03-10 05:49:22 瀏覽:756
數據結構與演算法基礎 發布:2025-03-10 05:47:35 瀏覽:730
php類調用變數 發布:2025-03-10 05:45:49 瀏覽:539
怎麼認識sony相機圖片配置文件 發布:2025-03-10 05:45:35 瀏覽:203
網件遠程訪問 發布:2025-03-10 05:45:33 瀏覽:461
伺服器為什麼可以訪問本地介面 發布:2025-03-10 05:41:08 瀏覽:963
安卓夏日先祖在哪裡 發布:2025-03-10 05:35:21 瀏覽:778
android拍照保存 發布:2025-03-10 05:35:15 瀏覽:626
網路伺服器ip是什麼意思 發布:2025-03-10 05:20:51 瀏覽:193