Database design 我如何构造我的DB表以允许用户跟踪多个表(人员、主题、问题等)

Database design 我如何构造我的DB表以允许用户跟踪多个表(人员、主题、问题等),database-design,social-networking,web-deployment,Database Design,Social Networking,Web Deployment,我想允许我网站上的用户关注我网站上的其他用户和主题,但我不确定如何将它们结合起来。想想quora是如何让你关注用户、话题、问题、编辑等的 为了跟踪用户,我打算让它非常简单: user_id: int followers_id: int 但这只对用户有好处,所以我想: user_id: int date: Date following: int(could be topic_id or user_id) following_type: text(topic or user) 我有点不确定这是否

我想允许我网站上的用户关注我网站上的其他用户和主题,但我不确定如何将它们结合起来。想想quora是如何让你关注用户、话题、问题、编辑等的

为了跟踪用户,我打算让它非常简单:

user_id: int
followers_id: int
但这只对用户有好处,所以我想:

user_id: int
date: Date
following: int(could be topic_id or user_id)
following_type: text(topic or user)
我有点不确定这是否是最好的方法,因为我必须解析类型以查询主题表或用户表(但好处是因为所有数据都在一个表中,我可以通过一次查询快速获得所有以下信息)


这是最好的方法还是有更好的方法(可能更高效、更可扩展等)来实现这一点?我是否应该将每个跟随器类型拆分为不同的表?我真的不确定应该考虑什么样的设计。

有几种不同的方法可以解决这个问题。如果您想继续使用关系数据库,您可以创建一个联接表(或多个联接表),它将跟踪所有的“follows”


如果您有时间查看一些非关系数据库,如MongoDB或Redis,您将能够准确地跟踪您想要的内容。这些服务允许您使用不同的参数构造自定义数据类型。关于这种类型的数据库可能值得一读。

显而易见的可能性是大量增加链接表——可以连接的项目的每种组合对应一个链接表

但是,通过使用inheritance1避免这种扩散可能更容易管理:

(未显示各种跟随项之间的关系。)

这样,无论有多少种可跟踪项(用户、主题、问题、编辑等),跟踪表都覆盖了它们

在关系数据库中,通常有两种表示继承的方法。有关更多信息,请查看中的“子类型关系”


1 Aka类别、子类型、子类、泛化层次结构等