对于Web应用程序,在多个页面上分隔嵌套讨论的最佳方法是什么?

时间:2009-02-24 15:57:10

标签: php mysql user-interface comments hierarchy

我正在为PHP / MySQL应用程序设计一个线程消息显示 - 比如对Slashdot或Youtube的评论 - 我想知道如何订购评论并将其分成页面以便你可以拥有20条评论到一个页面但仍然嵌套它们。

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

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

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

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

  • 第三个选项是像Slashdot那样做,它不会将注释分成页面,但有一个大树 - 为了保持页面大小可管理,它开始剔除低评级的注释。 / p>

我认为第一个是给出我的关系表的最简单的数据库查询,但是可以接受其他想法。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

我怀疑用户在最大的线程中发布不相关的评论的倾向是用户的产品,不想被卷入以找到线程的结尾,或者找到更合适的线程。通过自动压缩长线程,将所有线程的根目录显示在可管理长度的单个页面上,用户可以轻松扫描感兴趣的线程并根据需要添加到该线程。

答案 1 :(得分:0)

我认为您需要的是在数据库中存储分层数据。 你应该从这篇文章开始: Article at sitepoint Article at MySQL's website