我有一个可存储对文章的评论的cms。这些注释可以是线程的,也可以是非线程的。尽管从技术上讲,它们是相同的,只是在没有线程的情况下将reply列留为空白。我的应用程序可在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开始。如果在此评论中添加了回复,则会为其1.1分配ID 。对评论的答复1.1被赋予线程ID 1.1.1。注释同胞1.1被赋予线程id 1.2。你明白了。添加注释后,只需一个查询即可轻松计算出这些线程ID。
1.1
1.1.1
1.2
呈现线程时,将在单个查询中获取属于该线程的所有注释,并按线程ID对其进行排序。这使您可以按升序排列线程。此外,使用线程ID,您可以找到每个注释的嵌套级别,并相应地对其进行缩进。
1 1.1 1.1.1 1.2 1.2.1
有一些问题需要解决:
Drupal使用称为vancode的编号系统以更复杂的方式解决了第一个问题。至于第二个问题,可以通过在按降序排序时在线程id后面附加反斜杠(其ASCII码高于数字)来解决。您可以通过查看注释模块的源代码找到有关此实现的更多详细信息(请参见函数comment_get_thread之前的大注释)。