Baumstrukturen sind in unseren Anwendungen immer noch weit verbreitet, z. B. Dateiverzeichnisse, BBS, Berechtigungseinstellungen, Abteilungseinstellungen usw.
Diese
Dateninformationen nehmen alle eine hierarchische Struktur an, die in unserer aktuellen relationalen Datenbank schwer klar auszudrücken ist.Wie geht man
alsomit Baumstrukturproblemen im Programm
um?Kürzlich hat der Autor dieses Problem mithilfe eines ASP-Rechteverwaltungsprogramms problemlos gelöst, und jetzt werde ich es für die Leser klären.
Zunächst muss das hierarchische Datenmodell in ein relationales Datenmodell umgewandelt werden. Mit anderen Worten, wie man diese Datenstruktur in unseren ACCESS-, SQL SERVER-
, ORACLE- und anderen relationalen Datenbanken gestaltet.
Nehmen wir ein Beispiel wie die folgenden Daten:
Dokumentenverwaltung 1
|----Neues Dokument 2
|----Dokumentänderung 3
|----Dokumentenarchiv 4
|. |----Archivierte Informationen anzeigen 5
|. |----Archivierte Informationen löschen 6
|. |----Historische Dokumente löschen 7
|. |----Amtliches Dokument 8 löschen
|----Systemverwaltung 9
|----Benutzerverwaltung 10
Personalmanagement 11
Verwaltung 12
Finanzmanagement 13
Dies ist eine sehr typische hierarchische Datenstruktur. Überlegen Sie also, wie Sie sie in Form einer zweidimensionalen Tabelle ausdrücken können.
Es scheintzunächst
schwierig, oder? Aber nach sorgfältiger Überlegung gibt es immer noch eine Möglichkeit, es auszunutzen.
Auf diese Weise können alle oben genannten Berechtigungen als ein Berechtigungsfeld betrachtet werden. Dieses Berechtigungsfeld muss dann einen ID-Wert haben.
Anschließend fügen
wir
dieser relationalen Datentabelle zwangsweise ein weiteres Feld hinzu – das untergeordnete ID-Feld, das angibt, zu welcher Berechtigungsebene diese Berechtigung gehört, d. h. zu welchem ID-Wert dieser ID-Wert gehört. Beispiel: Der Berechtigungs-ID-Wert „Archivinformationen anzeigen“ ist „5“ und ist der Berechtigung „
Dokumentenarchivierung
“ untergeordnet , dann sollte der Wert des untergeordneten ID-Felds „4“ sein.Okay, wenn das verstanden werden kann, dann ist
unsere
Beziehungstransformationsarbeit im Grunde abgeschlossen.Beginnen wir mit dem Entwurf dieser relationalen Datentabelle (am Beispiel von SQL Server 7.0):
+-----------+-----------+----- --- ---+-----------+----------+
|. Feldname |. Feldtyp |
+-----------+-----------+-----------+-----------+- ---------+
|. SelfID |. Berechtigungs-ID |
|. PowerName |. Berechtigungsname |
|. PowerInfo |. Berechtigungsinformationen |
|. BelongID |. Belong ID |
+-----------+-----------+-----------+-----------+- ---------+
Okay, sobald die Struktur entworfen ist, können Sie Ihre Testdaten einfach eingeben.
Anschließend konzentrieren wir uns darauf, wie die hierarchische Struktur auf der Webseite nachgeahmt wird, um das ASP-Programm mit dieser Funktion anzuzeigen. Dies ist auch der kritischste Schritt.
Programmliste: powerlist.asp
<%
'Datenbankverbindung
set conn=Server.CreateObject("ADODB.Connection")
conn.open "driver={SQL Server};server=chaiwei;DATABASE=chaiwei;UID=sa;PWD="
'Alle Daten der übergeordneten Ebene öffnen
set rs=Server.CreateObject("ADODB.Recordset")
rs.Open "wähle * aus Potenzen aus, bei denen die Zugehörigkeits-ID null ist, Reihenfolge nach Leistungs-ID",conn,1,3
'Weisen Sie der Ausdrucksvariablen für die Ebenennummer einen Anfangswert zu
format_i=1
'Hauptprogrammabschnitt auflisten
do while not rs.eof
'Dateninformationen der übergeordneten Ebene drucken
Response.write "<a href='powerlist.asp?SelfID=" & rs("powerid") & "&BelongID=" & rs("belongid") & "'>" & rs("powername") & "< /a>"
Response.write "<br>"
'Unterprogrammaufruf, Datenverarbeitung auf Unterebene
Call ListSubPower(rs("powerid"))
rs.movenext
loop
'Schließen Sie den Datensatz der übergeordneten Ebene
rs.close
setze rs=nichts
'Unterprogramm zur Datenverarbeitung auf Unterebene
Sub ListSubPower(id)
'Öffnet alle Sub-Layer-Dateninformationen, die zur oberen Power-ID gehören
set rs_sub=Server.CreateObject("ADODB.Recordset")
rs_sub.Open "wählen Sie * aus Potenzen aus, wobei die Zugehörigkeits-ID = " & ID & " nach Leistungs-ID sortiert wird",conn,1,3
'Spalten-Unterschichtdaten
do while not rs_sub.eof
'Level-Zahlenausdrucksvariable progressive Akkumulation
format_i=format_i+1
'Schleifeneinrückungsformatsteuerung, da die oberste und zweite Ebene keine Einrückung erfordern, sodass auf dieses Programmsegment von der dritten Ebene aus verwiesen wird
für i=format_i bis 3 Schritt -1
Response.write „|“
Antwort.write " "
next
'Dateninformationen der Unterschicht drucken
Antwort.write " |----"
Response.write "<a href='powerlist.asp?SelfID=" & rs_sub("powerid") & "&BelongID=" & rs_sub("belongid") &"'>" & rs_sub("powername") & "< /a>"
Response.write "<br>"
'Rekursiv die Unterroutine selbst aufrufen, um die Unterschichtdaten schrittweise zu verarbeiten
ListSubPower(rs_sub("powerid"))
rs_sub.movenext
Schleife
'Die Anzahl der Ebenen zeigt an, dass die Variable zunehmend abnimmt
format_i=format_i-1
'Schließen Sie den Sub-Layer-Datensatz
rs_sub.close
setze rs_sub=nichts
Sub beenden
%>
Im Programm powerlist.asp öffnen wir zunächst die Daten der obersten Ebene und zeigen sie in der Schleife an. Anschließend entwerfen wir eine Unterroutine ListSubPower, die in der Schleife über a aufgerufen wird Der rekursive Algorithmus öffnet die Dateninformationen der Unterroutine und ruft sich wiederholt in der inneren Schleife der Unterroutine auf, um die tiefen Daten Schicht für Schicht zu erweitern.
Darüber hinaus wird im Programm eine statische Variable format_i verwendet, um das Anzeigeformat der Einrückung zu steuern.
Dieser Artikel ist ein einfacher Versuch zur Datengestaltung und Programmsteuerung in der Baumstruktur. Ich hoffe, dass die Leser weitere Inspirationen aus diesem Artikel ziehen können.