1. 引言
現實項目中經常遇到需要處理遞歸父子關系的問題,如果把層次關系分開,放在多個表里通過主外鍵關系聯接,最明顯的問題就是擴展起來不方便,對于這種情況,一般我們會創(chuàng)建一個使用自連接的表來存放數據。例如存放會員地區(qū)數據表結構可能是這樣:
列名 | 描述 |
location_id | 地區(qū)編號 |
location_name | 地區(qū)名稱 |
parentlocation_id | 上級地區(qū)編號 |
或者某個部分的職員表結構可能如下所示:
列名 | 描述 |
employee_id | 職員編號 |
employee_name | 職員名稱 |
manager_id | 職員的直接上級管理者,和employee_id進行自聯接 |
通過類似表結構,我們就可以通過一個表理論上管理無限級數的父/子關系,但是當我們需要將這些數據讀取出來,不論是填充到一個樹中,或是使用級聯顯示出來,需要花費一定的精力。傳統(tǒng)的做法,是做一個遞歸調用,首先連接數據庫將頂層數據(也就是parent_xxx為null的記錄)讀取出來,再對每一條數據進行遞歸訪問填充集合,這種做法需要連接數據庫多次,顯然不是較好的解決方法,那么我們能不能通過一次數據庫訪問,將數據全部讀取出來,并且為了按照父子關系形成集合,使返回的數據滿足某種格式。
2. 分析
理想情況下,如果父/子關系數據時嚴格按照關系結構添加到數據庫中,亦即首先添加某條父記錄,接著添加該父記錄的子記錄,如果子記錄還包含子記錄的話繼續(xù)添加,最終數據表中父/子關系按規(guī)則排列數據,我們就可以使用某種算法填充集合,但是正如我們所說,這是理想情況,實際情況下數據經常會發(fā)生改變,導致數據沒有規(guī)律可言,如下圖所示,這樣的話讀取數據填充集合就不太容易的。
所以我們要做的就是通過查詢使數據庫返回的數據滿足這種格式,那么我們的思路是首先查找頂層(0層)記錄,再查詢第1層記錄,接下來是第2層、第3層直到第n層。因為層數是不確定的,所以仍然需要使用遞歸訪問。
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈