惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Attack and Defense Labs
Attack and Defense Labs
The GitHub Blog
The GitHub Blog
C
Check Point Blog
博客园_首页
MongoDB | Blog
MongoDB | Blog
N
Netflix TechBlog - Medium
F
Full Disclosure
Microsoft Security Blog
Microsoft Security Blog
爱范儿
爱范儿
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
G
GRAHAM CLULEY
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Threat Research - Cisco Blogs
C
Cybersecurity and Infrastructure Security Agency CISA
V
Vulnerabilities – Threatpost
K
Kaspersky official blog
博客园 - 司徒正美
S
Schneier on Security
T
The Exploit Database - CXSecurity.com
Project Zero
Project Zero
云风的 BLOG
云风的 BLOG
Cisco Talos Blog
Cisco Talos Blog
Know Your Adversary
Know Your Adversary
雷峰网
雷峰网
V
V2EX - 技术
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Spread Privacy
Spread Privacy
罗磊的独立博客
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
Security Affairs
SecWiki News
SecWiki News
Schneier on Security
Schneier on Security
O
OpenAI News
Jina AI
Jina AI
PCI Perspectives
PCI Perspectives
Cyberwarzone
Cyberwarzone
Y
Y Combinator Blog
Apple Machine Learning Research
Apple Machine Learning Research
B
Blog RSS Feed
I
InfoQ
D
Docker
P
Palo Alto Networks Blog
Recorded Future
Recorded Future
M
MIT News - Artificial intelligence
博客园 - Franky
B
Blog
Scott Helme
Scott Helme
博客园 - 叶小钗
D
DataBreaches.Net

博客园 - 方寸心间

Strtus2 Convention Plugin - 方寸心间 【转】Java数组排序总结(冒泡,选择,插入,希尔) hibernate3.2由hbm文件生成pojo和ddl 【转】关于Hibernate的unsaved-value 【转】IntelliJ IDEA使用技巧一览表 【转】maven2完全使用手册 【转】HSQLDB安装与使用 【转】response.setHeader参数、用法的介绍 - 方寸心间 - 博客园 Spring中使用proxool的配置+【转】proxool.xml配置属性说明 [Ubuntu][MySQL]修改MySQL编码 - 方寸心间 [Ubuntu]下安装subversion - 方寸心间 Linux下./configure错误详解 - 方寸心间 【转】CVS使用手册 - 方寸心间 [MySQL]用户密码管理 - 方寸心间 [MySQL]MySql-front连接LINUX平台的MySQL服务 - 方寸心间 [Ubuntu]Apt-get命令参数详解 - 方寸心间 sun jdk,Tomcat在Linux下的安装 - 方寸心间 [Gentoo]中文输入软件Scim的安装【转】 - 方寸心间 [Gentoo]系统时间调整【转】
改进的前序遍历树模型(The Nested Set Model)
方寸心间 · 2009-08-17 · via 博客园 - 方寸心间

原理:

    我们先把树按照水平方式摆开。从根节点开始(“Food”),然后他的左边写上1。然后按照树的顺序(从上到下)给“Fruit”的左边写上2。这样,你沿着树的边界走啊走(这就是“遍历”),然后同时在每个节点的左边和右边写上数字。最后,我们回到了根节点“Food”在右边写上18。下面是标上了数字的树,同时把遍历的顺序用箭头标出来了。

 

    我们称这些数字为左值和右值(如,“Food”的左值是1,右值是18)。正如你所见,这些数字按时了每个节点之间的关系。因为“Red”有3和6两个值,所以,它是有拥有1-18值的“Food”节点的后续。同样的,我们可以推断所有左值大于2并且右值小于11的节点,都是有2-11的“Fruit” 节点的后续。这样,树的结构就通过左值和右值储存下来了。这种数遍整棵树算节点的方法叫做“改进前序遍历树”算法。

表结构设计:

常用的操作:

下面列出一些常用操作的SQL语句

返回完整的树(Retrieving a Full Tree)

SELECT node.name
  FROM nested_category node, nested_category parent
 WHERE node.lft BETWEEN parent.lft AND parent.rgt
   AND parent.name 'electronics'
 ORDER BY node.lft


返回某结点的子树(Find the Immediate Subordinates of a Node)

SELECT V.*
  FROM (SELECT node.name,
               (COUNT(parent.name) (AVG(sub_tree.depth) 1)) depth
          FROM nested_category node,
               nested_category parent,
               nested_category sub_parent,
               (SELECT V.*
                  FROM (SELECT node.name, (COUNT(parent.name) 1depth
                          FROM nested_category node, nested_category parent
                         WHERE node.lft BETWEEN parent.lft AND parent.rgt
                           AND node.name 'portable electronics'
                         GROUP BY node.name) V,
                       nested_category T
                 WHERE V.name T.name
                 ORDER BY T.lft) sub_tree
         WHERE node.lft BETWEEN parent.lft AND parent.rgt
           AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
           AND sub_parent.name sub_tree.name
         GROUP BY node.name) V,
       nested_category T
 WHERE V.name T.name
   and V.depth <= 1
   and V.depth 0
 ORDER BY T.Lft


返回某结点的祖谱路径(Retrieving a Single Path)

SELECT parent.name
  FROM nested_category node, nested_category parent
 WHERE node.lft BETWEEN parent.lft AND parent.rgt
   AND node.name 'flash'
 ORDER BY node.lft


返回所有节点的深度(Finding the Depth of the Nodes)

SELECT V.*
  FROM (SELECT node.name, (COUNT(parent.name) 1depth
          FROM nested_category node, nested_category parent
         WHERE node.lft BETWEEN parent.lft AND parent.rgt
         GROUP BY node.name) V,
       nested_category T
 WHERE V.name T.name
 ORDER BY T.Lft


返回子树的深度(Depth of a Sub-Tree)

SELECT V.*
  FROM (SELECT node.name,
               (COUNT(parent.name) (AVG(sub_tree.depth) 1)) depth
          FROM nested_category node,
               nested_category parent,
               nested_category sub_parent,
               (SELECT V.*
                  FROM (SELECT node.name, (COUNT(parent.name) 1depth
                          FROM nested_category node, nested_category parent
                         WHERE node.lft BETWEEN parent.lft AND parent.rgt
                           AND node.name 'portable electronics'
                         GROUP BY node.name) V,
                       nested_category T
                 WHERE V.name T.name
                 ORDER BY T.lft) sub_tree
         WHERE node.lft BETWEEN parent.lft AND parent.rgt
           AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
           AND sub_parent.name sub_tree.name
         GROUP BY node.name) V,
       nested_category T
 WHERE V.name T.name
 ORDER BY T.Lft


返回所有的叶子节点(Finding all the Leaf Nodes)

SELECT name FROM nested_category WHERE rgt lft 1


插入节点(Adding New Nodes)

LOCK TABLE nested_category WRITE;

SELECT @myRight := rgt FROM nested_category WHERE name 'TELEVISIONS';

UPDATE nested_category SET rgt rgt 2 WHERE rgt @myRight;
UPDATE nested_category SET lft lft 2 WHERE lft @myRight;

INSERT INTO nested_category
  (name, lft, rgt)
VALUES
  ('GAME CONSOLES', @myRight 1@myRight 2);

UNLOCK TABLES;


删除节点(Deleting Nodes)

LOCK TABLE nested_category WRITE;

SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt lft 1
  FROM nested_category
 WHERE name 'GAME CONSOLES';

DELETE FROM nested_category WHERE lft BETWEEN @myLeft AND @myRight;

UPDATE nested_category SET rgt rgt @myWidth WHERE rgt @myRight;
UPDATE nested_category SET lft lft @myWidth WHERE lft @myRight;

UNLOCK TABLES;