当前位置: 首页 > news >正文

DotNet菜鸟入门之无限极分类(一)设计篇

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

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

 

正文

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

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

         image

 

(图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路径字段,用来记录级别的路径记录。

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

转载于:https://www.cnblogs.com/tsql/p/9025094.html

相关文章:

  • Python 异常处理
  • 解决Geoserver请求跨域的几种思路,第二种思路用过
  • CentOS的rpm常用命令(转)
  • 怎样将apache和nginx的源码包转换为rpm包?
  • 03 逻辑与结构
  • QA质量意识
  • oracle,mongodb数据处理相关
  • 把SVN库,作为git服务器
  • Kali之aircrack-ng
  • Android 面试2018最新最全
  • js中添加node.js语法支持
  • 理解CAS算法在JAVA中的作用
  • 单体架构,SOA架构,微服务架构,分布式架构,集群架构
  • SqlServer查询出数据库中所有的表及其字段属性
  • 排除网络故障课后习题参考答案
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • java第三方包学习之lombok
  • PHP那些事儿
  • react-native 安卓真机环境搭建
  • Redis的resp协议
  • webgl (原生)基础入门指南【一】
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 学习Vue.js的五个小例子
  • 再次简单明了总结flex布局,一看就懂...
  • 追踪解析 FutureTask 源码
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 如何正确理解,内页权重高于首页?
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​iOS安全加固方法及实现
  • ​LeetCode解法汇总518. 零钱兑换 II
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #1015 : KMP算法
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (接口封装)
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (三十五)大数据实战——Superset可视化平台搭建
  • (四)linux文件内容查看
  • (四)图像的%2线性拉伸
  • (五)c52学习之旅-静态数码管
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET 命令行参数包含应用程序路径吗?
  • .Net多线程总结
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • [C#]猫叫人醒老鼠跑 C#的委托及事件