我有一个 MySQL 表,它的作用类似于嵌套集,以包含类别层次结构。表架构如下所示:
CREATE TABLE IF NOT EXISTS `categories` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(200) NOT NULL,
`parent_id` int(11) default NULL,
`lft` int(11) default NULL,
`rgt` int(11) default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `index_categories_on_parent_id_and_name` (`parent_id`,`name`)
)
lft
并rgt
定义节点的左右边界(嵌套集的工作方式是每个节点的 id 都落在其父节点的边界内),并parent_id
指定父节点。唯一索引允许有多个具有相同名称的类别,只要它们没有相同的父类别。
我试图找出一种基于层次结构在集合中找到特定节点的正确方法。例如,如果我查找 foo/bar/baz,我想检索名为 baz 的节点,其父节点名为 bar,其父节点名为 foo。显然,我不能只按名称搜索,因为可能有多个具有相同名称的类别。
我能想到的方法是找到最顶层的类别,然后找到具有给定名称的每个后续类别,其父 id 是先前找到的类别的名称,但这对我来说似乎不是很有效。有没有更好的方法来搜索嵌套集?