admin

存储树数据的快速关系方法(例如,文章的主题注释)

sql

我有一个可存储对文章的评论的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中。帮我快速浏览快速评论页面。


阅读 122

收藏
2021-05-10

共1个答案

admin

我真的很喜欢Drupal如何解决这个问题。它为每个注释分配一个线程ID。对于第一个评论,此ID从1开始。如果在此评论中添加了回复,则会为其1.1分配ID
。对评论的答复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的编号系统以更复杂的方式解决了第一个问题。至于第二个问题,可以通过在按降序排序时在线程id后面附加反斜杠(其ASCII码高于数字)来解决。您可以通过查看注释模块的源代码找到有关此实现的更多详细信息(请参见函数comment_get_thread之前的大注释)。

2021-05-10