โครงสร้างแบบต้นไม้ยังคงพบเห็นได้ทั่วไปในแอปพลิเคชันของเรา เช่น ไดเร็กทอรีไฟล์, BBS, การตั้งค่าการอนุญาต, การตั้งค่าแผนก ฯลฯ
ข้อมูล
เหล่านี้ ล้วนมีโครงสร้างแบบลำดับชั้น ซึ่งยากต่อการแสดงอย่างชัดเจนในฐานข้อมูลเชิงสัมพันธ์ปัจจุบันของเรา แล้วจะจัดการ
กับปัญหาโครงสร้างต้นไม้ในโปรแกรม
อย่างไร ?เมื่อเร็ว ๆ นี้ผู้เขียนสามารถแก้ไขปัญหานี้ได้อย่างง่ายดายผ่านโปรแกรมการจัดการสิทธิ์ ASP และตอนนี้ฉันจะจัดเรียงให้ผู้อ่านทราบ
ขั้นแรก โมเดลข้อมูลแบบลำดับชั้นจะต้องถูกแปลงเป็นรูปแบบข้อมูลเชิงสัมพันธ์ กล่าวอีกนัยหนึ่ง วิธีการออกแบบโครงสร้างข้อมูลนี้ใน ACCESS, SQL SERVER
, ORACLE และฐานข้อมูลเชิงสัมพันธ์อื่นๆ
ของเรา
ลองใช้ตัวอย่าง เช่นข้อมูลต่อไปนี้:
การจัดการเอกสาร 1
|----เอกสารใหม่ 2
|----การแก้ไขเอกสาร 3
|----เอกสารเก็บถาวร 4
|. |----ดูข้อมูลที่เก็บไว้ 5
|. |----ลบข้อมูลที่เก็บไว้ 6
|. |. |. |. |
|. |. |---ลบเอกสารราชการ 8
|----การจัดการระบบ 9
|----การจัดการผู้ใช้ 10
การบริหารงานบุคคล 11
การบริหารงาน 12
การจัดการทางการเงิน 13
นี่เป็นข้อมูลโครงสร้างแบบลำดับชั้นทั่วไป ดังนั้นลองคิดดูว่าจะแสดงออกมาในรูปแบบของตารางสองมิติได้อย่างไร
ดูเหมือนยากในตอนแรก
ใช่ไหม? แต่หลังจากพิจารณาอย่างถี่ถ้วนแล้วก็ยังมีวิธีหาประโยชน์จากมันอยู่
ด้วยวิธีนี้ สิทธิ์ข้างต้นทั้งหมดถือได้ว่าเป็นฟิลด์สิทธิ์เดียว ดังนั้นฟิลด์สิทธิ์นี้จะต้องมีค่า ID
จากนั้น
เรา
บังคับให้เพิ่มฟิลด์อื่นลงในตารางข้อมูลเชิงสัมพันธ์นี้ - ฟิลด์ ID รองซึ่งระบุระดับการอนุญาตที่การอนุญาตนี้เป็นของนั่นคือค่า ID ใดที่ค่า ID นี้เป็นของ ตัวอย่างเช่น: ค่า ID สิทธิ์ "ดูข้อมูลการเก็บถาวร" คือ "5" และอยู่ภายใต้สิทธิ์ "การเก็บถาวร
เอกสาร
" ดังนั้นค่าของฟิลด์ ID รองควรเป็น "4"โอเค ถ้าเข้าใจได้ ก็แสดงว่างานการเปลี่ยนแปลงความสัมพันธ์
ของเรา
เสร็จสมบูรณ์โดยพื้นฐานแล้วมาเริ่มออกแบบตารางข้อมูลเชิงสัมพันธ์กัน (ยกตัวอย่าง Sql Server 7.0):
+-----------+-----------+----- --- ---+------+----------+
|. ชื่อฟิลด์ |. ความหมายของฟิลด์ |. ขนาดของฟิลด์ |
+-----------+-----------+------+-----------+- ----+
|. SelfID |. รหัสการอนุญาต |. Int |
|. PowerName |. ชื่อการอนุญาต |. Varchar |
|. PowerInfo |. ข้อมูลการอนุญาต |. Varchar
|. BelongID |. เป็นของ ID |
+-----------+-----------+------+-----------+- ---------+
เอาล่ะ เมื่อออกแบบโครงสร้างแล้ว คุณก็สามารถป้อนข้อมูลทดสอบของคุณได้อย่างง่ายดาย
จากนั้นเราจะเน้นไปที่วิธีการเลียนแบบโครงสร้างลำดับชั้นในหน้าเว็บเพื่อแสดงโปรแกรม ASP ด้วยฟังก์ชันนี้ นี่เป็นขั้นตอนที่สำคัญที่สุดเช่นกัน
รายการโปรแกรม: powerlist.asp
<%
'การเชื่อมต่อฐานข้อมูล
ตั้งค่า conn=Server.CreateObject("ADODB.Connection")
conn.open "driver={SQL Server};server=chaiwei;DATABASE=chaiwei;UID=sa;PWD="
'เปิดข้อมูลเลเยอร์พาเรนต์ทั้งหมด
ตั้งค่า rs=Server.CreateObject("ADODB.Recordset")
rs.Open "select * from powers โดยที่ allowanced เป็นโมฆะโดย powerid",conn,1,3
'กำหนดค่าเริ่มต้นให้กับตัวแปรนิพจน์ตัวเลขระดับ
format_i=1
'รายการส่วนหลักของโปรแกรม
ทำในขณะที่ไม่ใช่ rs.eof
'พิมพ์ข้อมูลข้อมูลเลเยอร์พาเรนต์
response.write "<a href='powerlist.asp?SelfID=" & rs("powerid") & "&BelongID=" & rs("belongid") & "'>" & rs("powername") & "< /ก>"
response.write "<br>"
'การเรียกรูทีนย่อย การประมวลผลข้อมูลเลเยอร์ย่อย
Call ListSubPower(rs("powerid"))
rs.movenext
loop
'ปิดชุดข้อมูลเลเยอร์หลัก
฿.ปิด
ตั้งค่า rs=nothing
'รูทีนย่อยการประมวลผลข้อมูลชั้นย่อย'
Sub ListSubPower(id)
'เปิดข้อมูลชั้นย่อยทั้งหมดที่เป็นของ powerid บน
ตั้ง rs_sub=Server.CreateObject("ADODB.Recordset")
rs_sub.Open "select * from powerswhere allowanced=" & id & " order by powerid",conn,1,3
'คอลัมน์ข้อมูลชั้นย่อย
ทำในขณะที่ไม่ rs_sub.eof
'ระดับการแสดงออกจำนวนตัวแปรสะสมก้าวหน้า
format_i=format_i+1
'การควบคุมรูปแบบการเยื้องแบบวนซ้ำ เนื่องจากระดับบนสุดและระดับที่สองไม่จำเป็นต้องมีการเยื้อง ดังนั้นส่วนของโปรแกรมนี้จึงอ้างอิงมาจากระดับที่สาม
สำหรับ i=format_i ถึง 3 ขั้นตอน -1
การตอบกลับเขียน "|"
ตอบกลับเขียน " "
ถัดไป
'พิมพ์ข้อมูลข้อมูลชั้นย่อย
ตอบกลับเขียน " |----"
response.write "<a href='powerlist.asp?SelfID=" & rs_sub("powerid") & "&BelongID=" & rs_sub("belongid") &"'>" & rs_sub("powername") & "< /ก>"
response.write "<br>"
'เรียกรูทีนย่อยซ้ำๆ เพื่อค่อยๆ ประมวลผลข้อมูลในเลเยอร์ย่อย
ListSubPower(rs_sub("powerid"))
rs_sub.movenext
loop
'จำนวนระดับบ่งชี้ว่าตัวแปรกำลังลดลงอย่างต่อเนื่อง
format_i=format_i-1
'ปิดชุดข้อมูลเลเยอร์ย่อย
rs_sub.ปิด
ตั้งค่า rs_sub=ไม่มีอะไร
จบหมวดย่อย
%>
ในโปรแกรม powerlist.asp เราจะเปิดข้อมูลระดับบนสุดและแสดงในลูป จากนั้นเราจะออกแบบรูทีนย่อย ListSubPower ซึ่งถูกเรียกในลูปผ่าน a อัลกอริธึมแบบเรียกซ้ำเพื่อเปิดข้อมูลชั้นข้อมูลย่อยและเรียกตัวเองซ้ำ ๆ ในวงในของรูทีนย่อยเพื่อขยายชั้นข้อมูลลึกทีละชั้น
นอกจากนี้ ตัวแปรคงที่ format_i ยังถูกใช้ในโปรแกรมเพื่อควบคุมรูปแบบการแสดงการเยื้อง
บทความนี้เป็นความพยายามง่ายๆ ในการออกแบบข้อมูลและการควบคุมโปรแกรมในโครงสร้างแบบต้นไม้ จุดประสงค์คือเพื่อสร้างแรงบันดาลใจให้กับผู้อื่น ฉันหวังว่าผู้อ่านจะได้รับแรงบันดาลใจเพิ่มเติมจากบทความนี้