我只是使用修改的预订树遍历(MPTT)构建一个存储分层数据的表 - 您知道一个:每个节点都存储要查找的left
和right
ID它的后代。我正在使用CakePHP建议的模型,它与标准方式不同,每行都包含parent_id
。
以下是建议的表格结构:
CREATE TABLE categories (
id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
parent_id INTEGER(10) DEFAULT NULL,
lft INTEGER(10) DEFAULT NULL,
rght INTEGER(10) DEFAULT NULL,
name VARCHAR(255) DEFAULT '',
PRIMARY KEY (id)
);
以前从未使用过这种风格,并且不知道它是如何被搜索的,我想知道我应该将哪些字段编入索引?主键是否足够,或者我是否应该包括lft
和rght
?
答案 0 :(得分:4)
您将始终使用左列,但我经常需要找到所有叶节点。
WHERE lft = (rgt -1)
所以我通常只用lft,rgt。
对创建一个索引答案 1 :(得分:1)
我通常只索引左栏。我通常使用mysql,它只允许执行计划中每个表的一个索引用户,左边的索引帮助我为MPTT表编写的每个查询,并且包含在该索引中的权利是最小的。 / p>
简而言之,根据我的经验,左边的单个索引是几乎每个用例的插入/更新速度和选择速度之间的最佳平衡。