DotNet菜鸟入门之无限极分类(一)设计篇
写这个教程的原因,是因为,无限极分类,在许多项目中,都用得到。而对于新手来说,不是很好理解,同时,操作上也有一些误区或者不当之处。所以我就斗胆,抛砖引玉一下,已一个常见的后台左侧频道树为例子,讲解一下剖析一下无限极分类的实战操作。
既然是写给菜鸟的,那么我就不话结构图了,直接文字+代码来说明吧。
正文
无限极分类的关键就在于数据库设计时,进行了父类编号的记录,从而把所有的分类,链接了起来,成为一个链表样式的结构。
这次我要讲的无限极分类设计如下:
(图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菜鸟入门之无限极分类(一)设计篇的更多相关文章
- PHP实现无限极分类的两种方式,递归和引用
面试的时候被问到无限极分类的设计和实现,比较常见的做法是在建表的时候,增加一个PID字段用来区别自己所属的分类 $array = array( array('id' => 1, 'pid' =& ...
- php无限极分类以及递归(thinkphp)
php无限极分类: 无限极分类重点在于表的设计: 1在model中: class CatModel extends Model{ protected $cat = array(); public fu ...
- js实现无限极分类
转载注明出处!!! 转载注明出处!!! 转载注明出处!!! 因为要实现部门通讯录,后台传来的数据是直接从数据库里拿的部门表,所以没有层级分类,只有parentId表示从属关系,所以分类的事情就交给我来 ...
- C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制
在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Cachi ...
- PHP无限极分类
当你学习php无限极分类的时候,大家都觉得一个字“难”我也觉得很难,所以,现在都还在看,因为工作要用到,所以,就必须得研究研究. 到网上一搜php无限极分类,很多,但好多都是一个,并且,写的很乱, ...
- PHP无限极分类,多种方法|很简单,这里说的很详细,其它地方说的很不好懂
当你学习php无限极分类的时候,大家都觉得一个字"难"我也觉得很难,所以,现在都还在看,因为工作要用到,所以,就必须得研究研究. 到网上一搜php无限极分类,很多,但好多都是一 ...
- C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现
今天做一个管理后台菜单,想着要用无限极分类,记得园子里还是什么地方见过这种写法,可今天找了半天也没找到,没办法静下心来自己写了: 首先创建节点类(我给它取名:AdminUserTree): /// & ...
- 谈一次php无限极分类的案例
作者:白狼 出处:http://www.manks.top/php_tree_deep.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追 ...
- PHP无限极分类生成树方法,无限分级
你还在用浪费时间又浪费内存的递归遍历无限极分类吗,看了该篇文章,我觉得你应该换换了.这是我在OSChina上看到的一段非常精简的PHP无限极分类生成树方法,巧在引用,整理分享了. function g ...
随机推荐
- Ring0 - 链表
//一般驱动层不使用数据结构,一般Ring3层 双向链表可以将链表形成一个环.BLINK指针指向前一个元素,FLINK指针指向下一个元素.typedef struct _LIST_ENTRY { st ...
- CountDownLatch的简单讲解
正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...
- React 懒加载组件
//组件第一次初始化的时候加载. import React, {PropTypes} from 'react'; //import AppComposer from './views/App/AppC ...
- Redis-Migrate-Tool 使用详解
注意:目前不支持4.0.X及以上的redis使用 Redis 集群迁移工具,基于redis复制,快速,稳定. github链接:https://github.com/vipshop/redis-mig ...
- 猴哥来了-游戏开发记录17-微信排行榜bug
上线后排行榜bug 1.排序算法 const dataSorter = (gameDatas, field = Consts.OpenDataKeys.LevelKey) => { let d ...
- GRUB2 命令行使用笔记
在GRUB界面按C可进入命令行模式,学会命令行模式有助于玩转单机多OS. 磁盘描述规则: hd0,0 表示第1硬盘第1分区 help 显示帮助(内容会比这里全,此处只做几条常用命令介绍) cat 命令 ...
- Java for循环和foreach循环的性能比较
就是有些人循环用的是普通for循环,有些人用的是foreach循环,它们之间有什么区别?应该在什么时候使用这两种循环了? 两种循环的语法格式: 普通for循环语法: for (int i = 0; i ...
- concurrent.futures进线程池和协程
concurrent.futures 异步执行进程线程池的模块,一个抽象类,定义submit,map,shutdown方法 from concurrent.futures import Process ...
- webpack2.0配置postcss-loader
使用webpack2.0配置postcssloader 安装postcss-loader npm install --save-dev postcss-loader 然后配置webpack.confi ...
- 禁用SSL v2.0、SSL v3.0协议
1.禁用SSL v2.0.SSL v3.0协议,禁用低强度加密密钥.使用TLS 1 TLSv1.1 TLSv1.2版本.2.禁用SSLv2参考修补方法如下:查看本机sslv3加密列表:openssl ...