ファイル ディレクトリ、BBS、権限設定、部門設定など、ツリー構造は依然としてアプリケーションで非常に一般的です。これらの
データ
情報はすべて階層構造を採用しており、現在のリレーショナル データベースでは明確に表現することが困難です。では、プログラム内のツリー構造の問題に
どのように対処すればよいのでしょうか
?最近、著者は ASP 著作権管理プログラムを使用してこの問題を簡単に解決しました。ここで、読者のためにそれを整理してみます。
まず、階層データ モデルをリレーショナル データ モデルに変換する必要があります。言い換えれば、ACCESS、SQL SERVER
、ORACLE、その他のリレーショナル データベースでこのデータ構造を設計する方法です。
次のようなデータの例を見てみましょう:
文書管理 1
|---新しい文書 2
|---文書変更 3
|---文書アーカイブ 4
| |---アーカイブされた情報を表示する 5
| |---アーカイブ情報の削除 6
| |---歴史文書を削除します 7
| |---公式文書 8 を削除
|---システム管理 9
|---ユーザー管理 10
人事管理 11
管理 12
財務管理 13
これは非常に典型的な階層構造のデータですが、これを 2 次元のテーブルの形でどのように表現するかを考えてみましょう。最初は
難しそうに思えますよね?しかし、慎重に検討した結果、それを悪用する方法はまだあります。
このように、上記のすべての権限は 1 つの権限フィールドと見なすことができ、この権限フィールドには ID 値が必要です。
次に
、
このリレーショナル データ テーブルに別のフィールドを強制的に追加します。これは、この権限がどのレベルの権限に属するか、つまり、この ID 値がどの ID 値に属するかを示す下位 ID フィールドです。たとえば、「アーカイブ情報の表示」権限 ID 値が「5」で、「
ドキュメント
アーカイブ」権限に従属する場合、その下位 ID フィールドの値は「4」にする必要があります。OK、これが理解できれば
、
関係変革の作業は基本的に完了です。このリレーショナル データ テーブルの設計を開始しましょう (SQL Server 7.0 を例にします):
+-----------+-----------+----- --- ---+----------+----------+
| フィールド名 | フィールドの意味 | フィールドの属性 |
+-----------+-----------+-----------+-----------+- ---------+
| 許可 ID |
| 権限名 | 無効 |
| 権限情報 |
| 所属 ID |
+-----------+-----------+-----------+-----------+- ---------+
構造が設計されたら、テスト データを簡単に入力できます。
次に、この機能を使用して ASP プログラムを表示するために Web ページ内の階層構造をどのように模倣するかに焦点を当てます。これは最も重要なステップでもあります。
プログラム リスト: powerlist.asp
<%
'データベース接続
set conn=Server.CreateObject("ADODB.Connection")
conn.open "driver={SQL Server};server=chaiwei;DATABASE=chaiwei;UID=sa;PWD="
'すべての親レイヤー データを開きます
set rs=Server.CreateObject("ADODB.Recordset")
rs.Open "select * from memberid is null order by powerid",conn,1,3
'レベル番号式変数に初期値を代入
format_i=1
'メインプログラムセクションをリストします
do while not rs.eof
'親レイヤーのデータ情報を出力します
response.write "<a href='powerlist.asp?SelfID=" & rs("powerid") & "&BelongID=" & rs("belongid") & ''>" & rs("powername") & "< /a>"
response.write "<br>"
'サブルーチン呼び出し、サブレイヤーデータ処理
Call ListSubPower(rs("powerid"))
rs.movenext
ループ
'親レイヤー データ セットを閉じる
rs.close
rs=何も設定しない
'サブレイヤデータ処理サブルーチン
Sub ListSubPower(id)
'上位 powerid に属するすべてのサブレイヤ データ情報を開きます
set rs_sub=Server.CreateObject("ADODB.Recordset")
rs_sub.Open "select * from powers where believeid=" & id & " order by powerid",conn,1,3
'列サブレイヤー データ
do while not rs_sub.eof
'レベル番号式変数プログレッシブ累積
format_i=format_i+1
'ループ インデント形式制御。最上位と 2 番目のレベルにはインデントが必要ないため、このプログラム セグメントは 3 番目のレベルから参照されます。
for i=format_i から 3 ステップ -1
応答.write "|"
応答.書き込み " "
next
'サブレイヤーデータ情報を印刷します
応答.write "|----"
response.write "<a href='powerlist.asp?SelfID=" & rs_sub("powerid") & "&BelongID=" & rs_sub("belongid") &"'>" & rs_sub("powername") & "< /a>"
response.write "<br>"
'サブルーチン自体を再帰的に呼び出して、サブレイヤー データを段階的に処理します
ListSubPower(rs_sub("powerid"))
rs_sub.movenext
ループ
'レベルの数は、変数が徐々に減少していることを示します
format_i=format_i-1
'サブレイヤー データ セットを閉じます
rs_sub.close
rs_sub=何も設定しない
エンドサブ
%>
powerlist.asp プログラムでは、まずトップレベルのデータを開いてループ内に表示し、次に、ループ内で呼び出されるサブルーチン ListSubPower を設計します。再帰アルゴリズムを使用して、サブルーチンの層データ情報を開き、サブルーチンの内部ループでそれ自体を繰り返し呼び出して、層ごとに深いデータを展開します。
さらに、プログラム内では静的変数 format_i を使用してインデントの表示形式を制御します。
この記事では、ツリー構造でのデータ設計とプログラム制御を簡単に試みます。読者がこの記事からさらにインスピレーションを得られることを願っています。