我正在为 PHP/MySQL 应用程序设计一个线程消息显示——比如 Slashdot 或 Youtube 上的评论——我想知道我应该如何对评论进行排序并将其分成页面,这样你就可以在一个页面上有 20 条评论但仍然让它们嵌套。
我的应用程序中的评论可以嵌套无限级别,并且此结构使用我认为的邻接关系表表示,这是一个单独的表,其中包含具有任何升序/降序关系的每一对的一行。该关系表具有 CHILDID、PARENTID 和 LEVEL,其中级别 2 表示“曾祖父母”,依此类推。
我的问题是最终用户的可用性和构建高效数据库查询的实用性之一。我考虑了这些选项:
无论在树中的位置如何,按日期将结果拆分为页面,以便特定日期范围内的所有评论将一起出现,即使它们没有与父母一起出现。任何在同一时间发布到其父级的评论都将出现在同一页面上,在这种情况下,我们可以将它们显示为“嵌套”,但会有来自其父级的孤立评论。这可能是可以接受的 - 这是 YouTube 评论中的处理方式 - 比其父级晚得多的评论不会与其父级出现在同一页面上(如果父级不在最新页面上),而是出现其他最新评论。
像遍历树一样按顺序检索节点。尽管兄弟姐妹仍然可以按日期排序,但这会优先考虑树结构而不是日期。这样做的好处是,即使该父级是最近评论的数页,回复总是与他们的父级(他们要回复的评论)一起放置。这就是 icanhascheezburger 博客等应用程序的处理方式。我不喜欢它的一些事情,比如每个人都想对最大的树枝添加回复的方式。
第三种选择是像 Slashdot 那样做,它不会将评论分成页面,而是有一棵大树 - 为了保持页面大小可管理,它开始剔除低评级的评论。
我认为第一个是给定我的关系表的最简单的数据库查询,但对其他想法持开放态度。
所有这三种系统中的一些这样的系统以某种方式限制了嵌套级别——这很容易做到,一旦我们递归了 X 级别,其他所有东西都可以组合在一起,就好像它们是兄弟姐妹一样。例如,YouTube 评论只呈现到一个级别。其他系统有时会在 5 个左右的级别后说“超出嵌套级别”。