カテゴリの階層を含めるために、ネストされたセットのように機能する 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 を探す場合、親が bar という名前で、親が foo という名前の baz という名前のノードを取得したいと考えています。明らかに、名前だけで検索することはできません。同じ名前のカテゴリが複数存在する可能性があるからです。
これを行う方法は、最上位のカテゴリを見つけてから、親 ID が以前に見つかったカテゴリのものである指定された名前を持つ後続の各カテゴリを見つけることですが、これはあまり効率的ではないようです。ネストされたセットを検索するより良い方法はありますか?