zoukankan      html  css  js  c++  java
  • 无限级分类功能实践

    在一般的web开发中,无论是一般的企业建站,内部OA,电商,无限级分类都是一种很常见的功能。

    实现该业务常见有三种(本人已知)方式,分别有其不同的优缺点,一般最常用是第一种,接下来分别简单介绍其数据结构和大体实现。

    第一种:

    表结构

    字段 类型 主键
    id int
    parent_id int
    value varchar
    CREATE TABLE `NewTable` ( 
    `id`  int UNSIGNED NOT NULL , 
    `parent_id`  int UNSIGNED NOT NULL , 
    `value`  varchar(100) NOT NULL , 
    PRIMARY KEY (`id`) 
    );
    

    实现思路(代码示例)

    function reorginaze($list, $parentId=0) {
        $result = array();
        foreach ($list as $item) {
            if ($item[' parent_id '] == $parentId) {
                $item['children'] = reorginaze($list, $item['parent_id']);
                $result[] = $item;
            }
        }
        return $result;
    }
    $list = db_query(“SELECT * FROM NewTable”);
    $tree = reorginaze($list);
    

    优点:实现简单,能够高效取出和展示小规模的数据,非常适合用于常见的菜单、分类、标签等业务场景,添加叶节点和根节点也非常简单

    缺点:删除中间叶节点稍显复杂,不适合单独取出某一链条,不适合规模较大的数据(1K或更多),代码性能随着层级加大而下降(虽可通过添加冗余字段改善,但数据维护成本较高),不适合用于较复杂的业务场合(如评论回复,组织架构(一个人可能属于多个部门or职务),用户关注链,音频相似链等表示数据实体单向关系的场景)

    第二种:

    表结构

    字段 类型 主键
    id int
    value varchar
    CREATE TABLE `comment` (
    `id`  int UNSIGNED NOT NULL AUTO_INCREMENT ,
    `value`  varchar(200) NOT NULL ,
    PRIMARY KEY (`id`)
    );
    
    字段 类型 主键
    ancestor_id int
    descendant_id int
    CREATE TABLE `comment_tree` (
    `ancestor_id`  int NOT NULL ,
    `descendant_id`  int NOT NULL ,
    PRIMARY KEY (`ancestor_id`, `descendant_id`)
    );
    

    实现思路(代码示例)

    -- 兼容方法1
    SELECT A.*, B.ancestor_id AS parent_id FROM comment A INNER JOIN comment_tree B ON A.id = B.descentdant_id
    # 获取指定记录x后代列表
    SELECT B.* FROM comment_tree A INNER_JOIN comment B ON A.descent_id = B.id WHERE A.ancestor_id = x
    # 获取指定记录y的祖先列表
    SELECT B.* FROM comment_tree A INNER_JOIN comment B ON A.ancestor_id = B.id WHERE A.descent_id = x
    

    优点:适中的复杂度,适应中等规模数据,适应绝大部分业务场景,既实现方法的所有查询方法,也能方便取出树结构部分

    缺点:每个节点的关系在comment_tree需要一条数据记录,数据规模巨大或节点关系复杂(不是单纯树结构,子节点有多个父节点)时表的数据量可能大到难以接受。

    第三种:

    待续。。。

  • 相关阅读:
    C# base64编码、解码
    C#异常重试通用类Retry
    C#操作Control异步工具类
    Notepad++的Json格式化插件
    CG 标准函数库
    Unity 几种优化建议
    基于Unity的Profiler性能分析
    Time.timeScale、游戏暂停
    Lua 中的string库(字符串函数库)总结
    Lua 日志
  • 原文地址:https://www.cnblogs.com/koboshi/p/4027735.html
Copyright © 2011-2022 走看看