我有一个cms存储对文章的评论.这些注释可以是线程和非线程.虽然技术上他们是一样的只是答复列留空,当它没有线程.我的应用程序适用于sqlLite,MysqL和pgsql,所以我需要相当标准的sql.
我目前有一个评论表
comment_id article_id user_id comment timestamp thread (this is the reply column)
我的问题是找出如何最好地表示数据库中的线程注释.也许在一个单独的表中支持没有内容的树集和一个简单的表来保存文本?也许在这个方式已经是?还有另一种方式?
如果注释是非线程的,我可以轻松地按时间戳排序.
如果他们是线程我排序这样
ORDER BY SUBSTRING(c.thread,1,(LENGTH(c.thread) - 1))
从ORDER BY可以看出,注释查询将永远不会使用索引,因为基于函数的索引只能真正存在于Oracle中.帮助我减轻快速评论页面.
解决方法
我真的很喜欢
Drupal如何解决这个问题.它为每个注释分配一个线程ID.该ID从第一个注释开始为1.如果在此评论中添加了回复,则会为其分配ID 1.1.对评论1.1的回复给出了线程ID 1.1.1.评论1.1的兄弟姐妹给出了线程ID 1.2.你得到这个想法添加注释时,可以使用一个查询轻松计算这些线程ID.
线程呈现时,属于线程的所有注释都将以单个查询获取,并按线程ID进行排序.这给你的线程按升序排列.此外,使用线程ID,您可以找到每个注释的嵌套级别,并相应缩进.
1 1.1 1.1.1 1.2 1.2.1
有几个问题要整理出来:
>如果线程ID的一个组件增长到2位数,则按线程ID排序将不会产生预期的顺序.一个简单的解决方案是确保线程ID的所有组件都被零填充以具有相同的宽度.
>按降序排列的线程ID不会产生预期的降序.
Drupal使用一个名为vancode的编号系统,以更复杂的方式解决了第一个问题.对于第二个问题,通过在按顺序排序时将反斜杠(其ASCII代码高于数字)附加到线程ID来解决.您可以通过检查comments module的源代码(请参阅函数comment_get_thread之前的大注释)来查找有关此实现的更多详细信息.