术→技巧, 研发

知乎话题结构数据库设计

钱魏Way · · 1,374 次浏览

先前一直在研究好的树形结构的数据存储方案,也分析了关系数据库中各种树形结构数据的设计。但是仔细分析下来离自己想要实现的树形结构的数据还是有一些差距。前端时间看了下知乎的树形的话题结构,发现目前知乎的实现方案还是非常的不错。以下为整理的一些信息,目前不清楚知乎后端是如何实现的。

知乎话题的价值

知乎上,大的话题一般有很多的关注者,但可能仅仅是对这个话题有宽泛的兴趣;细分话题的关注者可能较少,但他们通常比一般人对相关领域有更深入的了解。添加了某个子话题的问题会同时在父话题页面上出现,从而有可能被没有关注这个话题的用户发现。

这样可以带来几个好处:

  • 提问时只需要添加一两个话题就能保证问题能够被细分领域的专家用户发现,同时也有机会被对问题可能兴趣的大量其他用户看到。
  • 方便用户从一个入口到达某个领域相关、由浅入深的各类内容。
  • 话题关系本身,提供了知乎上全部内容的一个真实、客观的分类与目录结构。

刚开始使用知乎时,你可能对很多领域都有宽泛的兴趣。比如我关注了「历史」和「自然科学」。随着使用和阅读,我慢慢对这两个领域有了更深的了解,发现和历史相关的内容里,我对于「西方历史」和「历史人物」有着更大的兴趣,而对经常出现在历史话题问题中的「中国近代史」不太感兴趣。于是我可以进一步关注「西方历史」和「历史人物」,参与更多关于这二者的讨论。以后我还有可能发现西方历史和历史人物中对我有更大吸引力的更深入的内容。自然科学方面也相似,我很快发现「物理」下的「量子物理」和「电磁学」才是真正令我着迷的所在。

父子话题结构可以帮助用户循序渐进的了解、参与知乎上的相关内容和相关讨论。我相信在知乎,每个人都会持续地面对令人激动的新发现。

知乎话题的结构

除根节点在内的三层底层话题会由知乎站方决定,不对用户开放话题结构的修改。话题结构是由社区通过公共编辑创建与维护的。

话题树

知乎的全部话题构成一个有根、无循环、有向图 (Rooted Acyclic Directed Graph)。可以理解为是允许节点入度大于 1 的「树」(允许多个父节点),也即两个节点之间可能有多条路径,存在树枝交叉的「树」。

父子话题

话题父子结构的作用是让每个话题页上都能够全面集中地显示相关领域下的内容。三层以内子话题中的问题,都会显示在父话题页面上。

是否需要建立父子关系的判断标准:

  • 对于已经存在的话题,编辑父子结构时首先应当考虑的是,子话题中的问题是否是关注父话题的用户所感兴趣的。
  • 如果是为话题创建新的子话题,则要确保子话题是对父话题现有内容的某种分类,并且在未来能够出现持续的讨论。
  • 没有必要在关于一个细分领域的讨论出现前就把子话题创建出来。
  • 如果在某个话题下,有些问题很明显的属于一类,这时候就该为这些问题创建一个合适的子话题了。

弱节点

有些分类性质的话题,在话题结构中是必要的,但是关于这些话题本身的讨论会相对有限。此时可以把它们设置为「弱节点」,则父话题上的问题来源会直接显示为更下一级的子话题。

「英语」「法语」「粤语」「乌尔都语」等数十乃至数百种语言不可能直接添加为「语言」话题子话题,而是会通过「印欧语系」「汉语」等中间级话题来分类。将「印欧语系」设置为弱节点后,在「语言」话题页上,绑定「英语」话题的问题就会直接显示为来自「英语」。

弱关系

话题父子结构逐级继承,关系链达到一定长度后,可能会失去内容上的相关性,比如「动物 > 人 > 人际关系 > 社交 > 社交网络 > Facebook」。通常三层继承关系的限制能够避免这个问题的出现,但如果要限制三层以内子话题内容的显示,就可以使用「弱关系」。假设有话题关系「A > B > C」, A-B 为弱关系,那么绑定了 B 的问题会在 A 话题页显示,绑定了 C 的问题则不会显示。任何情况下,直接子话题下的问题都会进入父话题页,不会受到弱关系影响。

整体来说,知乎在话题结构的处理上,还是做的非常的不错的,类似的实现方式可以应用到图书分类等领域。对于后端的实现,目前还不清楚,会持续关注。

参考链接:

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注