写这个教程的原因,是因为,无限极分类,在许多项目中,都用得到。而对于新手来说,不是很好理解,同时,操作上也有一些误区或者不当之处。所以我就斗胆,抛砖引玉一下,已一个常见的后台左侧频道树为例子,讲解一下剖析一下无限极分类的实战操作。

既然是写给菜鸟的,那么我就不话结构图了,直接文字+代码来说明吧。

正文

无限极分类的关键就在于数据库设计时,进行了父类编号的记录,从而把所有的分类,链接了起来,成为一个链表样式的结构。

这次我要讲的无限极分类设计如下:

(图1)

创建的表的sql语句如下,具体字段的说明见(图1)

CREATE TABLE Channel(
[id] [varchar](2000) NOT NULL,
[channelName] [nvarchar](50) NOT NULL,
[linkUrl] [varchar](200) NULL,
[parentID] [varchar](2000) NOT NULL,
[childNum] [int] NOT NULL,
[orderNum] [int] NOT NULL
)
其中,约定的基类编号为C,也就是说,第一级的分类,父编号为C,第一个分类的编号为C001
它的第一个子类编号为001,也就是说,每一级子类的编号为父类编号+ 000格式的数字。
举例如下(名称 编号 父编号):
  
|-食物 C001 C
|-----蔬菜 C001001 C001
|---------白菜 C001001001 C001001
|---------萝卜 C001001002 C001001
|---------冬瓜 C001001003 C001001
|-----水果 C001002 C001
|---------苹果 C001002001 C001002
|---------橘子 C001002002 C001002
 

说明:

这样设计的优点:

1)只要知道这个分类的编号,那么去掉后三位,就是此类的父类编号。例如,食物这个类别,代码是C001,那么去掉后三位,他的父编号就是C,而蔬菜这个类别,代码是C001001,去掉后三位,他的父类编号就是C001.

如此,只要知道了一个分类的编号后,就不用再去查询数据库,找他的父类编号了。可以直接用程序算出,他的父类编号。

2)方便的知道这个类别的深度,也就是几级分类。算法就是——(分类编号长度-1)/3。

例如,食物这个分类的编号为 C001,那么他的分类级别为: (4-1)/3 = 1。

那么蔬菜这个分类的级别就是: (7-1)/3 = 2。为2级分类。

3)可以程序直接算出所有的父类,省去了递归的过程。

例如冬瓜这个分类,循环去掉三位后,得到他的父类编号依次为:

C001001 、 C001 、 C

设计的缺点:

1)主键不是数字类性,相对数字为主键的索引来说,速度稍慢,不过好在数据不会太多。

2)扩展性不是很好,可以看出,这个无限极分类,同级别的分类最多只能分到999级别,即C001到C999,如果你想更多,那么可以设定为 C0001到C9999即9999个同类级别。不过一般说是无限极分类,但是999的同级别,一般情况下,就够用了。

主要还是看需求来指定,是否是使用数字为主键和父类编号的分类,还是用字符的。

提示:如果使用数字作为主键和父类编号,那么需要增加一个path路径字段,用来记录级别的路径记录。

此种无限极分类的设计,就介绍到这里了。下一篇文章,写一下这种设计的操作及相关代码

DotNet菜鸟入门之无限极分类(一)设计篇的更多相关文章

  1. PHP实现无限极分类的两种方式,递归和引用

    面试的时候被问到无限极分类的设计和实现,比较常见的做法是在建表的时候,增加一个PID字段用来区别自己所属的分类 $array = array( array('id' => 1, 'pid' =& ...

  2. php无限极分类以及递归(thinkphp)

    php无限极分类: 无限极分类重点在于表的设计: 1在model中: class CatModel extends Model{ protected $cat = array(); public fu ...

  3. js实现无限极分类

    转载注明出处!!! 转载注明出处!!! 转载注明出处!!! 因为要实现部门通讯录,后台传来的数据是直接从数据库里拿的部门表,所以没有层级分类,只有parentId表示从属关系,所以分类的事情就交给我来 ...

  4. C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制

    在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Cachi ...

  5. PHP无限极分类

      当你学习php无限极分类的时候,大家都觉得一个字“难”我也觉得很难,所以,现在都还在看,因为工作要用到,所以,就必须得研究研究. 到网上一搜php无限极分类,很多,但好多都是一个,并且,写的很乱, ...

  6. PHP无限极分类,多种方法|很简单,这里说的很详细,其它地方说的很不好懂

    当你学习php无限极分类的时候,大家都觉得一个字"难"我也觉得很难,所以,现在都还在看,因为工作要用到,所以,就必须得研究研究.   到网上一搜php无限极分类,很多,但好多都是一 ...

  7. C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现

    今天做一个管理后台菜单,想着要用无限极分类,记得园子里还是什么地方见过这种写法,可今天找了半天也没找到,没办法静下心来自己写了: 首先创建节点类(我给它取名:AdminUserTree): /// & ...

  8. 谈一次php无限极分类的案例

    作者:白狼 出处:http://www.manks.top/php_tree_deep.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追 ...

  9. PHP无限极分类生成树方法,无限分级

    你还在用浪费时间又浪费内存的递归遍历无限极分类吗,看了该篇文章,我觉得你应该换换了.这是我在OSChina上看到的一段非常精简的PHP无限极分类生成树方法,巧在引用,整理分享了. function g ...

随机推荐

  1. java 字节码 指令集 汇编(转)

    https://blog.csdn.net/github_35983163/article/details/52945845 网上找的没有指令码这列  自己把它加上 更方便查阅 指令从0x00-0xc ...

  2. Oracle 存储过程起步

    存储过程的注释不能写在第一行 select后面要有into create or replace procedure DelEmp(v_empno in emp.empno%type) AS No_re ...

  3. [UE4]控件模板参数

    创建的时候就会变成这样了.

  4. Composer 安装时要求输入授权用户名密码

    composer require "overtrue/laravel-socialite:~2.0" Authentication required (packagist.phpc ...

  5. PostgreSQL 一主多从(多副本,强同步)简明手册 - 配置、压测、监控、切换、防脑裂、修复、0丢失 - 珍藏级

    参考来源: https://github.com/digoal/blog/blob/master/201803/20180326_01.md#postgresql-一主多从多副本强同步简明手册---配 ...

  6. Spring MVC 类型转换

    SpringMVC类型转换: 1 日期类型转换: private Date birthday; <label for="">生日:<input type=&quo ...

  7. HibernateUtil工具类的使用

    为了简化代码的重复性,使用HibernateUtil工具类对Hibernate有关的代码进行整合 主要实现有,getSessionFactory(),getSession(),closeSession ...

  8. node mongodb 案例代码

    1.db: var mongoose=require("mongoose"); mongoose.connect('mongodb://localhost:8686/mytest' ...

  9. word_宏示例

    参考:https://jingyan.baidu.com/article/870c6fc3326588b03fe4beeb.html 内容自适应 Application.Browser.Target ...

  10. Java - 27 Java 集合框架

    Java 集合框架 早在Java 2中之前,Java就提供了特设类.比如:Dictionary, Vector, Stack, 和Properties这些类用来存储和操作对象组. 虽然这些类都非常有用 ...