2

我正在为 PHP/MySQL 应用程序设计一个线程消息显示——比如 Slashdot 或 Youtube 上的评论——我想知道我应该如何对评论进行排序并将其分成页面,这样你就可以在一个页面上有 20 条评论但仍然让它们嵌套。

我的应用程序中的评论可以嵌套无限级别,并且此结构使用我认为的邻接关系表表示,这是一个单独的表,其中包含具有任何升序/降序关系的每一对的一行。该关系表具有 CHILDID、PARENTID 和 LEVEL,其中级别 2 表示“曾祖父母”,依此类推。

我的问题是最终用户的可用性和构建高效数据库查询的实用性之一。我考虑了这些选项:

  • 无论在树中的位置如何,按日期将结果拆分为页面,以便特定日期范围内的所有评论将一起出现,即使它们没有与父母一起出现。任何在同一时间发布到其父级的评论都将出现在同一页面上,在这种情况下,我们可以将它们显示为“嵌套”,但会有来自其父级的孤立评论。这可能是可以接受的 - 这是 YouTube 评论中的处理方式 - 比其父级晚得多的评论不会与其父级出现在同一页面上(如果父级不在最新页面上),而是出现其他最新评论。

  • 像遍历树一样按顺序检索节点。尽管兄弟姐妹仍然可以按日期排序,但这会优先考虑树结构而不是日期。这样做的好处是,即使该父级是最近评论的数页,回复总是与他们的父级(他们要回复的评论)一起放置。这就是 icanhascheezburger 博客等应用程序的处理方式。我不喜欢它的一些事情,比如每个人都想对最大的树枝添加回复的方式。

  • 第三种选择是像 Slashdot 那样做,它不会将评论分成页面,而是有一棵大树 - 为了保持页面大小可管理,它开始剔除低评级的评论。

我认为第一个是给定我的关系表的最简单的数据库查询,但对其他想法持开放态度。

所有这三种系统中的一些这样的系统以某种方式限制了嵌套级别——这很容易做到,一旦我们递归了 X 级别,其他所有东西都可以组合在一起,就好像它们是兄弟姐妹一样。例如,YouTube 评论只呈现到一个级别。其他系统有时会在 5 个左右的级别后说“超出嵌套级别”。

4

2 回答 2

2

我认为您想要嵌套评论的原因是因为您的用户倾向于一次阅读一个感兴趣的线程。也就是说,您有理由相信用户会创建连贯的思想链,和/或在一个线程中讨论的内容会引起一些用户的兴趣,而其他用户则不会。

如果是这种情况,我不知道您为什么要按日期任意拆分页面(选项 1)。使用单页剔除低评分评论(选项 3)似乎有点苛刻,可能会阻止用户发表评论。如果您拥有像 SlashDot 这样的受众群体,这可能是一件好事,但对于具有更典型访问率的网站来说,这可能是不可取的。

也许你可以有类似选项 2 的东西,所有线程都在同一个页面上,但是如果一个线程开始变得太长,它会被卷成一个链接,将用户带到一个专用于该线程的页面。或者,可以减少长线程以仅显示其主题行和作者,每个主题行和作者又链接到线程专用页面中的适当位置。

我怀疑用户在最大线程中发布不相关评论的趋势是用户不想被滚动以找到线程末尾或找到更合适的线程的产物。通过自动压缩长线程,将所有线程的根显示在可管理长度的单个页面上,用户可以轻松扫描感兴趣的线程并在需要时添加到它。

于 2009-02-25T14:43:38.503 回答
0

我认为您需要将分层数据存储在数据库中。您应该从这篇文章开始: sitepoint 上的文章 MySQL 网站上的文章

于 2009-02-24T19:10:52.177 回答