隣接リストモデルは二つのテーブル
-
22-09-2019 - |
質問
い 考え 私の問題を突き詰めれば二つの質問:
どうして作成traversableツリー構造のPHPがツリーに格納されMySQLとはテーブルに隣接リストモデルアプローチの性能を維持しながら、ょうか。
何の保守性アプローチに表示するツリーの形式でなく複製フォーカストラバーサルコードポイ捨てのロジックif/elseスイッチ算はどこでわかりますか?
下記より詳細:
私が使っているのZend Framework.
私と仕事をしています。で保存され、MySQLデータベースとは別のテーブル:ご質問やquestion_groups.各テーブルには適切なZend_Db_Table_*ます。の階層表現に隣接リストモデルです。
この問題は私の走り入れによっているからだと思うの詰め物をツリー構造で、RDBMSんに開かれる。しかし、私もの保管アンケートの回答および対応で代替的アプローチがポートも)を指定する必要があります。
アンケートのニーズに表示される様々なHTMLフォーマット:
- として記録用紙対応を利用Zend_Form)
- として、順序つきリスト(ネスト)の質問で"あなたと 一部の グループ)としてリンク閲覧対応するようなテーマを設定またはグループ
- として、順序つきリスト(nested)との対応に追加されます。
問題が葉ノードquestion_groupsを含むことができその他のquestion_groups及び/又は質問をします。わが100の行を処理し、表示されます。
現在は、ビューのヘルパーがすべての処理を再帰取得question_groupの子ども(検索を行うと、両テーブル:QuestionGroup::getChildren($id).プラスを表示する際のアンケートの質問回答の追加二つのクエリに必要な取得する回答とその対応から解答を入力していきます。
のページのロード時間な非常に長いこのアプローチを感じ間違っています。再帰プラス、複数のデータベースのクエリ用いることにより、ほぼすべてのノードが存在しないを感じさせてくれる温かいファジィです。
たって 再帰レ 再帰方法の完全ツリーで返された配列から、EUの構築を階層的に配列を渡り、表示します。しかし、そうなりが複製されたノードidにより、このグループやご質問に保存され別のテーブルになったかもしれない情報を見落とさないようござい---
現在、論理表示のツリーの形式を記述が大変なことになっています。私はあまり好きではないのですが複製のフォーカストラバーサルロジックの場所です。しかし、条件分岐の場所なのに、最も簡便に維持コードです。私は本を読み漁り、訪問者にデコレータのPHP SPL反復子がまだ感じかどう全ての作業と共に授業が伸びるZend_Db_Table,Zend_Db_Table_RowsetとZend_Db_Table_Row.ている問題の階層からのデータベースです。ができると思うのですが新規追加表示フォーマット(または変更は既存少します。
解決
の隣接リストは従来す
parent_id
列の各行のリンクを行力します。のparent_id
がNULLの場合、列の根幹である。こへ行くのSQLクエリー、。別の列の追加
root_id
で各行は何をツリーに行えるようになります。そのように取すべてのノードのツリーとシングルSQLクエリ。追加方法をおTable
クラスを取得すRowset
によるツリーのルートidです。class QuestionGroups extends Zend_Db_Table_Abstract { protected $_rowClass = 'QuestionGroup'; protected $_rowsetClass = 'QuestionGroupSet'; protected function fetchTreeByRootId($root_id) { $rowset = $this->fetchAll($this ->select() ->where('root_id = ?', $root_id) ->order('id'); ); $rowset->initTree(); return $rowset; } }
書カスタムクラス延長
Zend_Db_Table_Row
書き機能を取得する指定された行の親会ともRowset
その子供たち。のRow
クラスが含まれる必要があ保護データオブジェクト参照の親の配列。ARow
オブジェクトさせてしまうこともありまgetLevel()
機能とgetAncestorsRowset()
機能のためのパンくず.class QuestionGroup extends Zend_Db_Table_Row_Abstract { protected $_children = array(); protected $_parent = null; protected $_level = null; public function setParent(Zend_Db_Table_Row_Abstract $parent) { $this->_parent = $parent; } public function getParent() { return $this->_parent; } public function addChild(Zend_Db_Table_Row_Abstract $child) { $this->_children[] = $child; } public function getChildren() { return $this->_children; } public function getLevel() {} public function getAncestors() {} }
書カスタムクラス延長
Zend_Db_Table_Rowset
この機能に対して繰り返し処理を実行する行の行セットの設定,男親又は女親と子供の参考文献できるようにその後に移動します。ものRowset
すべてgetRootRow()
機能です。class QuestionGroupSet extends Zend_Db_Table_Rowset_Abstract { protected $_root = null; protected function getRootRow() { return $this->_root; } public function initTree() { $rows = array(); $children = array(); foreach ($this as $row) { $rows[$row->id] = $row; if ($row->parent_id) { $row->setParent($rows[$row->parent_id]); $rows[$row->parent_id]->addChild($row); } else { $this->_root = $row; } } } }
今話ができ getRootRow()
は、rowsetを返しますルートノードです。一度、ルートノードできる電話 getChildren()
ループを目指します。話ができ getChildren()
またこれらの中間子を再帰的に出力するツリーを任意のフォーマットしています。