摘要:
对于这种这种无限级分类方法,目前我还处于实验阶段,可行性和执行效率还没有进行过深入的研究,发明的无限级分类方法。也许先前就已经有人发明过了。关键字:
正则 无限级分类 正文:
时隔N久,不常来的我又厚着脸皮来了,呵呵,首先十分感谢大家对《 (原创+首发) 30分钟学会用PHP写带数据库的简单通讯录 [连载结束] 》一帖的支持。
这次我为大家带来一种我自己发明的无限级分类方法。也许先前就已经有人发明过了,但我不知道,不过这的确是我自己想出来的,我就不要脸的暂时说是我发明的吧,呵呵。
继续引用上篇文章的开场白:
我接触PHP也不是很久,所以有什么不足的地方,欢迎各位指正,让大家见笑了。
对于这种这种无限级分类方法,目前我还处于实验阶段,可行性和执行效率还没有进行过深入的研究,欢迎大家探讨,如果还不错的话,我们就可以把它运用到实战当中去了。事实上,我自己已经有此打算,呵呵。
很多人将无限级分类神化了,因为在实际运用当中,用到十级以上的就已经很少见了。人们需要的不是“无限”,而是需要避免在以后更多的分级出现时,不至于给程序和数据库大换血,那可是很恐怖的事情啊。
这里我们只讨论数据库设计部分,至于程序设计部分,有时间我们再单独拿出来讨论。看过很多无限分类的方法,都比较复杂且难以理解,我的这种方法原理实际上很简单,一目了然,好了,闲话不说了,我们来看看它的原理。
我们以 “*” 号代表第几个分类,用 “_” 代表分类的级别:
*(一级分类)
*_*(二级分类)
*_*_*(三级分类)
……
以此推类(无限分类)
代入整数后,我们可以精确的得到分类,如:
18 (第18个一级分类)
20_50 (第20个一级分类下的第50个二级分类)
128_35_1 (第128个一级分类下的第35个二级分类下的第1个三级分类)
……
以此推类(第N个N级分类下的N级分类下的……)
我们来建一个最基本的“test”表来实验一下,三个字段就可以了:
id(int) code(varchar) name(varchar)
自然排序 分类代码 分类名称
当然如果真要变态的搞成“无限”的话,把code设为TEXT好了,其实varchar就绰绰有余了,呵呵。
OK,我们开始做实验,记住我们的口号是“整数”和“正则”,我们先来查询所有的一级类别吧,由于一级类别全部由整数构成,那我们的SQL语句就应该这样写:SELECT * FROM `test` WHERE `code` REGEXP '^[1-9]+$';
哇哈哈,成功了,不错的开始,那我们再来查查“图片”的二级分类看看,二级分类应该有1个 “_” 号,而“图片”又是第2个一级分类,所以我们的SQL语句就应该这样写:SELECT * FROM `test` WHERE `code` REGEXP '^2_[1-9]+$';
呀呵呵,又成功了,应该还是可以用的,最后我们来查查“新闻”的三级别分类看看,三级分类应该有2个 “_” 号,而“新闻”又是第1个一级分类,加上“国际”是第1个二级分类,所以我们的SQL语句就应该这样写:SELECT * FROM `test` WHERE `code` REGEXP '^1_1_[1-9]+$'
咿嘻嘻,再次成功了,大概是没有什么问题了。好了,其他的实验就不再一一列举了。大家有兴趣的话,可以也自己去试试看,试出问题是最好的了,因为我们总是期望问题出现在测试中,而不是正式的使用过程中。
我们可以发现,在SQL语句中,所用的“正则”是有一定规律的“^”开头、“[1-9]+”中间、“$”结尾。再结合“*”和“_”的规律,那么动动脑筋写程序就不是什么问题了,因为有“一定规律”的事物,用程序实现起来往往不是那么麻烦。
至于用程序实现插入、修改、删除、排序等等,如果有时间的话,我再写[程序设计设计篇]吧。那么[数据库设计篇]到此为止,感谢大家浪费宝贵时间来看了一下。
任何无限级分类的方法都有自己的优点和缺陷,我不指望我的这种方法能有多好,能够给大家派上用场,只希望能够为大家提供一条新的思路,一种耳目一新的感觉,说不定大家看了之后,由此方法联想到更好的方法呢?呵呵。
若有什么不足或错误的地方,希望大家批评指正。
还是那句话:自知这种文章多如牛毛,再烂好歹也是原创,所以……各位口下留情,小弟知错了,呵呵。