在所有子代都引用其所有父代的树中移动对象

时间:2018-07-07 12:28:28

标签: mysql node.js hierarchy

我想问的是,是否有一种方法可以比我目前设置的更好地处理mysql中的分层数据。

在我的mysql数据库中,我为论坛存储了一个浅层次结构:

Titles(0) > Boards(1) > Threads(2) > Comments(3) type(0, 1, 2, 3)

层次结构表示如下:

Table 1: posts.title, posts.id, posts.type
post.title(title is the data within the post)
post.id(id is the primary key of the post)
post.type((what level)/(how deep) the post is in the hierarchy)

Table 2: parent_tree=(pt) pt.child, pt.parent
pt.child (primary key of a post)
pt.parent (primary key of post which is a parent of the child post)

每个帖子都有一个自我引用的parent_tree条目(例如:创建具有id=7的新帖子会在parent_tree中产生一个新条目,其中子项为7,父项为7

每条创建后的帖子也会复制其下创建的所有父级PARENTS(还将包括其自引用)。

插入(POST)很简单。创建新帖子后,将进行两个查询-一个用于插入新帖子,第二个查询用于插入其parent_tree副本,该查询将child设置为外键(使用ON DELETE CASCADE)。

获取(GET)很简单,用户可以通过id / titletype选择帖子。

删除(DELETE)很简单,删除由id / titletype选择的帖子(并删除其外键parent_tree条目)。

移动(PUT)是最复杂的,它包含两个查询。
在此操作中,选择了一个帖子(title / id)和一个(parent_title / parent_id)以指定将其移动到哪个parent

第一个查询-选择所有parent_tree个条目,其中父ID =要移动的帖子的ID,选择所有parent_tree个条目,其中child是上一个选择的结果,返回所有孩子以及所有父母的职位。然后,从此选择中删除所有父级,子级对,其中父级也是所选帖子的父级

(简短)删除帖子parent_tree中的条目及其子项,而父项将其作为子项。

第二个查询-插入要移动的帖子的子代,并将帖子本身,所选帖子的新父级的所有父级(包括自引用)插入到其下。

这是我在mysql中查询移动信息的方式(完全可以接受建议,对于mysql和学习我还是比较陌生的。)

第一个查询:

DELETE t FROM parent_tree AS t INNER JOIN parent_tree AS c ON t.child=c.child INNER JOIN parent_tree AS p ON t.parent=p.parent WHERE c.parent IN (SELECT id FROM posts WHERE title=?) AND p.child<>p.parent AND p.child IN (SELECT id FROM posts WHERE title=?)
  

?[0,1] = title_of_post_being_moved

第二个查询:

INSERT INTO parent_tree(child,parent) (SELECT t.child, p.parent FROM parent_tree AS t INNER JOIN parent_tree AS p WHERE t.parent IN (SELECT id FROM posts WHERE title=?) AND p.child IN (SELECT id FROM posts WHERE title=?) AND t.child<>p.parent)
  

?[0] = title_of_post_being_moved,?[1] = title_of_new_parent_post

0 个答案:

没有答案