百木园-与人分享,
就是让自己快乐。

树形结构的菜单表设计与查询

开发中经常会遇到树形结构的场景,比如:导航菜单、组织机构等等,但凡是有这种父子层级结构的都是如此,一级类目、二级类目、三级类目。。。

对于这种树形结构的表要如何设计呢?接下来一起探讨一下

首先,想一个问题,用非关系型数据库存储可不可以?

答案是肯定可以的,比如用mongoDB,直接将整棵树存成json。但是,这样不利于按条件查询,当然也取决于具体的需求,抛开需求谈设计都是耍流氓。

在菜单这个场景下,一般还是用关系型数据库存储,可以将最终的查询结构缓存起来。

常用的方法有四种:

  • 每一条记录存parent_id
  • 每一条记录存整个tree path经过的node枚举
  • 每一条记录存 nleft 和 nright
  • 维护一个表,所有的tree path作为记录进行保存

 

第一种:每条记录存储parent_id

这种方式简单明了,但是想要查询某个节点的所有父级和子级的时候比较困难,势必需要用到递归,在mysql里面就得写存储过程,太麻烦了。

当然,如果只有两级的话就比较简单了,自连接就搞定了,例如:

第四种:单独用一种表保存节点之间的关系

CREATE TABLE `city` (
`id`
int(11) NOT NULL AUTO_INCREMENT,
`name`
varchar(16),
PRIMARY KEY (`id`) USING BTREE
) ENGINE
= InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;

CREATE TABLE `city_tree_path_info` (
`id`
int(11) NOT NULL AUTO_INCREMENT,
`city_id`
int(11) NOT NULL,
`ancestor_id`
int(11) NOT NULL COMMENT \'祖先ID\',
`
level` tinyint(4) NOT NULL COMMENT \'层级\',
PRIMARY KEY (`id`) USING BTREE
) ENGINE
= InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;

来源:https://www.cnblogs.com/cjsblog/p/14714444.html
图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 树形结构的菜单表设计与查询

相关推荐

  • 暂无文章