On Monday 27 July 2009 22:26:32 Ali wrote: > Hi > > Please correct me if I am wrong, but I thought that root node will have > left and right value, if that is not the case I reckon best is to keep > it as 1.
As far as I can tell, it's common to keep *both* structures (left, right and id, parent_id). The first one is used for most tree operations, the latter one is for referential integrity and, if needed, rebuilding the tree. Please correct me if this is wrong. > > Thanks > > Ali > > Dalibor Karlović wrote: > > On Monday 27 July 2009 10:33:29 Nick Pack wrote: > >> Hey All, > >> > >> I recently added a new proposal draft to the wiki for a new component, I > >> am attempting to get out of the box support for the modified preorder > >> tree traversal algorithm, I have some working code kindly provided by > >> Hector Virgen, that does basically what I am proposing (it just needs > >> refinement) and am just after some feedback on the proposal from the > >> community. > >> > >> The proposal is located at: > >> http://framework.zend.com/wiki/display/ZFPROP/Zend_Db_Table_Mptt+-+Nick+ > >>Pac k > >> > >> An excellent article on what MPTT is and how you use it is at (for those > >> of you that have no idea what MPTT is!): > >> http://www.sitepoint.com/article/hierarchical-data-database/ > >> > >> I have a couple of questions with regards to its design that I would > >> like some feedback on. > >> > >> 1. Should the top level parent node have parent_id values of 0 or NULL, > >> from a normalisation perspective, one would guess that the parent should > >> be 0 so that all values in the col are of the same type, however by > >> using 0 you are effectively creating a reference to a non-existant row - > >> any feedback on this behavior would be greatly appreciated > > > > If we're talking DB, you must use null to comply to DB FK restrictions. > > If we're talking code, 0 is fine. > > > >> 2. This question is with regards to handling deletion of nodes that have > >> children, it would seem much more sensible to move the child nodes of > >> the deleted node up to the grandparent node, rather than breaking the > >> chain of parent references or deleting the child nodes completely, is > >> this the best way to approach it? > > > > You can mimick the FK behavior: MAKE NULL, RESTRICT and CASCADE. I'd add > > REATTACH here and you should be set. > > > > like this: > > > > // make all direct children root nodes, retaining their subtrees > > $table->delete($id, Zend_Db_Table_Mptt::DELETE_MAKE_NULL); > > > > // restrict deleting if child nodes exists > > if ($table->delete($id, Zend_Db_Table_Mptt::DELETE_RESTRICT)) { > > // delete successful > > } else { > > // delete failed > > } > > > > // delete the node and all it's child nodes recursively > > $table->delete($id, Zend_Db_Table_Mptt::DELETE_CASCADE); > > > > // attach all nodes direct children to it's parent, making them siblings > > $table->delete($id, Zend_Db_Table_Mptt::DELETE_REATTAC); > > > > // attach all nodes direct children to node with ID $newParent > > $table->delete($id, Zend_Db_Table_Mptt::DELETE_REATTACH, $newParent); > > > > These are all just examples, but you should get the gist. :) -- Dado
