树形结构表设计

树形结构在我们的日常开发中经常用到,很多功能为了展示层次关系往往都使用树形结构来存储,对于树形结构数据表设计,也有多种方案供我们选择,接下来我就介绍下树形结构表设计的一些基本方案。以组织结构中的部门表(department)为例

  • 常规设计。一张表搞定,记录父级id即可,如下:
    CREATE TABLE `department` (
      `departmentid` smallint(5) unsigned NOT NULL auto_increment,    // 部门流水ID
      `title` varchar(90) NOT NULL default ”,                                          // 部门名称
      `parentid` smallint(5) unsigned NOT NULL default ‘0’,                     // 部门上级ID
      ·path` varchar(60) NOT NULL default ”,                                         // 部门路径Id
      `displayorder` smallint(6) unsigned NOT NULL default ‘1000’,          // 部门显示顺序
      PRIMARY KEY  (`departmentid`),
      KEY `parentid` (`parentid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    数据表记录数据如下:
    部门ID部门名称父级ID路径显示顺序
    1技术开发部0 1
    2开发组112
    3开发A组21,23
  • 基于左右值编码。
    CREATE TABLE `department` (
      `departmentid` smallint(5) unsigned NOT NULL auto_increment,    // 部门流水ID
      `title` varchar(90) NOT NULL default ”,                                          // 部门名称
      `parentid` smallint(5) unsigned NOT NULL default ‘0’,                     // 部门上级ID
      `lft` smallint(6) unsigned NOT NULL default ‘0’,                              // 左值
      `rght` smallint(6) unsigned NOT NULL default ‘0’,                           // 右值
      PRIMARY KEY  (`departmentid`),
      KEY `parentid` (`parentid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    数据表记录数据如下:
    部门ID部门名称父级ID左值右值
    1技术开发部016
    2开发组125
    3开发A组234
  • 节点表 + 关系表
     CREATE TABLE `department` (
      `departmentid` smallint(5) unsigned NOT NULL auto_increment,          // 部门流水ID
      `title` varchar(90) NOT NULL default ”,                                                // 部门名称
      `displayorder` smallint(6) unsigned NOT NULL default ‘1000’,                // 部门显示顺序
      PRIMARY KEY  (`departmentid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;    

    CREATE TABLE `departmentrelation` (
      `parentid` smallint(5) unsigned NOT NULL default ‘0’,                        // 节点父级ID
      `childid` smallint(5) unsigned NOT NULL default ‘0’,                          // 节点ID
      `level` smallint(3) unsigned NOT NULL default ‘0’,                             // 节点深度
      PRIMARY KEY  (`childid`,`parentid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    数据表记录数据如下:
                                                                                         部门表(department)

    部门ID
    部门名称
    显示顺序
    1技术开发部1
    2开发组2
    3开发A组3

                                                                              关系表(departmentrelation)

    父级ID子级ID节点深度
    110
    121
    221
    132
    232
    332

    原文作者:Z字形编排问题
    原文地址: https://blog.csdn.net/nieyanlong/article/details/7630788
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞