在数据库

时间:2018-01-09 02:28:23

标签: sql postgresql database-design relational-database entity-relationship

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

我有以下要求:

  1. 用户可以创建帖子
  2. 用户可以喜欢帖子
  3. 用户可以评论帖子
  4. 用户可以评论其他用户评论(回复评论)
  5. 用户可以发表评论
  6. 现在我知道如果用户以评论的形式回复其他用户,我们可以拥有深层嵌套的评论。我想出了一些自引用表,这些表都继承自公共实体表。这是我到目前为止的实施:

    enter image description here

    ^^我知道有可能“喜欢”另一个人“喜欢”或评论“喜欢”这不是一个要求。为了防止这种情况,我想我可以在应用程序代码级别强制执行这些约束。如果我们可能希望将来实施这些选项,那么将选项保持开放总是更好吗?

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

2 个答案:

答案 0 :(得分:3)

您的基本架构结构可能适用于您提到的基本用例。我只是错过了评论和帖子之间的联系(评论属于哪个帖子)。你也可以争辩说评论和帖子是同一类型的对象,只是通过与他们拥有(或没有)的另一篇文章的关系来区分。还 - 更重要的是:

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

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

有关图表数据库的热门示例,请参阅this

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

答案 1 :(得分:0)

目前的实施已经足够了。 需要考虑的要点:

  • 分享帖子的喜欢和评论的喜好可能会使开发更加清晰。
  • 考虑关系数据库中性能问题的深层嵌套注释(可能需要递归和/或多个连接)。您可以考虑将评论限制为2的深度(Facebook和Youtube的例子)。
  • 更多属性:用户密码,实体的创建日期等