在数据库中实现帖子、评论和喜欢

joh*_*ohn 5 sql postgresql database-design entity-relationship relational-database

我试图在 Twitter 和 Instagram 等社交媒体平台之后在 Postgresql 中建模一个数据库。

我有以下要求:

  1. 用户可以创建一个帖子
  2. 用户可以喜欢帖子
  3. 用户可以对帖子发表评论
  4. 一个用户可以评论另一个用户的评论(回复评论)
  5. 用户可以喜欢评论

现在我意识到如果用户不断以评论的形式回复其他用户,我们可以拥有深度嵌套的评论。我想出了一些自引用表,它们都继承自一个公共实体表。到目前为止,这是我的实现:

在此处输入图片说明

^^ 我知道可以“喜欢”另一个人“喜欢”或评论“喜欢”,这不是必需的。为了防止这种情况,我想我可以在应用程序代码级别强制执行这些约束。保留选项总是更好,以防我们将来可能想要实施它们,对吗?

我的问题是,这是一个好的数据库实现吗?是否有我没有看到的用例和陷阱?设计是否适合用例?

Osw*_*ann 5

您的基本模式结构可能可用于您提到的基本用例。我只是缺少评论和帖子之间的联系(哪个评论属于哪个帖子)。您还可以认为评论和帖子是同一类型的对象,只是通过与它们拥有(或不拥有)的另一个帖子的关系来区分。另外——更重要的是:

如今,您应该考虑使用图形数据库来对社交媒体领域进行建模。正如您在模式中看到的,大多数数据都是表之间的链接,而关系数据库实际上并不是最擅长高度链接的数据。这是因为 SQL 查询最终可能会包含大量联接,一旦图形达到一定的大小和深度,这些联接可能会成为性能问题。

还可以将关系数据库(或 nosqldb)与图形数据库结合使用,在图形数据库中,您仅对图形内的链接网络进行建模,而在常规数据库中则对更多面向表的数据进行建模。

有关图形数据库的流行示例,请参阅

有关为什么图形数据库在图形建模方面优于关系数据库的更多信息,请阅读

  • @Onur Onder:我的第一个建议是在数据库设计中使事情尽可能简单 - 不要应用复杂的面向对象的思维。我通常为特定的功能需求设计表格,尽可能小并且与系统的其余部分无关。通过使用 UUID 进行 PK 和引用,我不必局限于引用列中的一种特定类型的目标类型/表。 (2认同)