手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜Qcloud , 注册 | 登陆

精通MYSQL数据库——连载十五

首页 > DataBase >

当你需要把分类表显示为树形时,肯定是需要进行一些妥协,就象前面文章中所说的,对数据进行这种处理意味着要无数的SQL查询命令或者复杂的客户端代码打交道。
可供选择的解决方案之一是在分类表中增加两列:sort,deepth,SORT字段负责给出各条数据记录将出现在层次关系树的第几行(假设同一层次的记录将分类名进行排序),DEEPTH字段则负责该分类所在的层次深度。
这种方式的好处是可以通过在MYSQL程序中执行下面这条简单查询的办法得到证明。例如:SELECT CONCAT( SPACE(deepth * 2) ,catename ) as category , sort , deepth FROM categories ORDER BY sort.其中concat函数的功能是把两个字符串并为一个,space函数的功能是生成指定个数的空格字符,AS关键字是给整个表达式起一个新的名字(别名,可能更容易理解一些)。
执行这样的SQL后,可以生成一个简单的树结构,树的尝试都是通过deepth的空格来显示的(这里显示简单的例子)
CATENAME          SORT    DEEPTH
主分类            0       0
一级分类          1       1
二级分类         2       2
重复一级分类         3       1
重复二级分类         4       2
三级分类           5       3
大致结构如上。
那么sort值和deepth的值是怎么来的呢?我们会进行一个简单的演示:
1、新建一个[新的三级分类],它被插入到[二级分类]下一级。而二级分类有关的数据是sort=2,deepth=2
2、那么我们首先要找到[二级分类]下是否已经有数据插入,SQL为:WHERE parentId = [二级分类]ID
3、将数据追加到二级分类下(即SORT+1,深度=)
4、更新相关数值
在这里面就涉及到一些问题,二级分类下如果有多个三级分类,三级分类还有四级分类,这时候SORT值的取值就比较难以控制。插入值后,它的SORT值其实是覆盖了原来的重复一级分类的SORT,那么,原来的SORT值>=当前SORT值的,都需要自动加1.
由此可见,虽然SORT值和DEEPTH值简化了查询工作,但实际上他的写操作变得频繁和复杂了。如果需要更新其中的一条记录,所涉及的操作还会更多。因为他必须要相应的调整sort值和deepth值。
因此,在实际情况中,你必须决定是对读操作进行优化还是对写操作进行优化。一般情况下,对于这种分类表,我都比较倾向于一次读出,然后利用 PHP语言进行深度的处理 也就是说,我是一般不会用SORT和DEEPTH字段的。因为大多数情况下,分类表都是一种比较固定的表,不大会读写,而在后台的读写,也不会影响到前台的操作。。

好象有点乱。




本站采用创作共享版权协议, 要求署名、非商业和保持一致. 本站欢迎任何非商业应用的转载, 但须注明出自"膘叔", 保留原始链接, 此外还必须标注原文标题和链接.

Tags: mysql, 连载

« 上一篇 | 下一篇 »

只显示10条记录相关文章

发表评论

评论内容 (必填):