1、树形结构应用场景
有时我们需要保存一些树形的数据,比如组织架构、话题讨论、知识管理、商品分类等,这些数据之间存在一种递归关系,很多开发人员想到的第一个解决方案往往是记录每个节点的父节点,例如以下的评论表。
CREATE TABLE comments (
comment_id int(10) NOT NULL,
parent_id int(10) DEFAULT NULL,
comment text NOT NULL,
PRIMARY KEY (comment_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
采用这样的结构,就需要编写复杂的代码递归检索很多记录,查询的效率就会很低。如果数据量不大、讨论内容相对固定,数据的层次较少,那么采用这样的结构就会是简单的、清晰的,这种情况下此结构还是合适的;但如果数据量很大,查询就会变得很复杂。下面介绍两种更通用,扩展性更好的解决方案:路径枚举和闭包表。
2、路径枚举(增加一个字段存储所有父级节点信息,用特殊符号分割开)
基于上面的表结构,可以增加一个字段path,用于记录节点的所有祖先信息。记录的方式是把所有的祖先信息组织成一个字符串。
因为路径(path)字段包含了该节点的所有祖先信息,所以可以轻易地获取某个节点的所有祖先节点,可以用程序先获取pa