分享

嵌套评论的一个数据库设计技巧

 hehffyy 2012-08-30

前些日子看drupal源码时学到的。要实现嵌套评论,只要在表里加一个parent_id字段即可,添加评论的时候很方便,不过显示起来就会慢/麻烦一点。其实只要在表里再添加一个字段,就可以高效/快速的显示评论了,这个字段就是thread。看一下SQL构造语句

CREATE TABLE IF NOT EXISTS `comments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) NOT NULL,
  `topic_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `username` varchar(64) NOT NULL,
  `created` int(11) NOT NULL,
  `changed` int(11) NOT NULL,
  `status` int(11) NOT NULL,
  `content` text NOT NULL,
  `thread` varchar(30) NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

thread类似这样

//存储在thread字段中的数据类似下面
1/
1.1/
1.2/
1.a/
2/

加上"/“是因为”/“的ascii值大于任何数字,包括”.",这样如果要按时间倒序排序的话,直接

SELECT * FROM `comments` WHERE topic_id = 1 ORDER BY thread DESC

如果要按时间正序排序(从小到大)的话,就有问题了,因为"1/" > “1.1/”,结果就是"1.1/"在"1/“前面,这当然是不合理的,只要把最后的”/"去掉就行了,这样"1"就小于"1.1"

SELECT * FROM `comments` as c WHERE topic_id = 1 ORDER BY SUBSTRING(c.thread, 1, (LENGTH(c.thread) - 1)) ASC

显示时,可以根据thread里"."的数量处理缩进(回复的回复)



原文地址:http://blog./tech/2010/08/27/nested-comments.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约