【问题标题】:Composite Foreign Keys in PostgresPostgres 中的复合外键
【发布时间】:2018-04-17 14:24:36
【问题描述】:

我目前正在使用用于社交媒体应用程序的数据库。数据库在postgresql上运行,我遇到了逻辑问题。

我有两种不同类型的内容可以提交,主题和帖子。每个都有自己的主键。

所有这些都有项目可以附加一些媒体。在我的媒体表中,我有 content_type_id 和 content_id 列,其中 content_type 是具有不同类型内容的查找表中的键,而 content_id 是存储特定内容的表中的主键。

我遇到的问题是我无法在 content_id 上创建外键,因为根据 content_type 它可能引用两个表之一。有没有办法可以设置外键来根据 content_type_id 列的值查看正确的表?

【问题讨论】:

标签: sql postgresql design-patterns database-design


【解决方案1】:

我不确定是否理解您的问题,但您遇到了设计问题。如果我的解释是正确的,也许你需要这样的设计:

但如果您不提供当前的设计,我无法知道。

关于这个设计:

  • CONTENT_TYPE 可以是 POSTTOPIC
  • MEDIA 可以有 1 个 CONTENT_TYPEPOSTTOPIC)。
  • CONTENT_TYPE可以关联N个MEDIA

【讨论】:

  • 我遇到的问题是媒体是附加到内容(图片、文档或其他类型的文件)的东西。所以 content_id 还需要是表的一个伪造键,它被附加到一个帖子 ID 或一个主题 ID。由于 post 表和 topic 表可以有重叠的 id,我希望能够使用 content_type_id 作为显示它是 post 或 topic 的一种方式。但我不知道是否有一种方法可以让伪造键约束根据另一列的值检查其有效性。
  • 要区分帖子或主题,您可以在CONTENT_TYPE 上添加一列来做到这一点。您可以使用布尔值,或者更好的整数,以便将来能够为更多内容类型(1 代表主题,0 代表帖子)。
【解决方案2】:

问题已解决。不是让每个表都有自己的主键序列,而是在所有表中使用单个序列,实体类型查找表成为实体映射表,将现在的全局 id 映射到它的实体类型(post,主题等)。这样就不再需要辅助表来区分主键是帖子还是主题。

例如,在创建帖子之前,它使用顺序 id 作为主键 (1,2,3,4...),当创建主题时,同样的事情会发生顺序键 (1,2 ,3,4,...)。

当媒体存储在 media_table 中时,media_table 会出现重复实体键的问题(id 为 1 的帖子和 id 为 1 的主题都有图片)。最初设计为通过在媒体表中添加一个列来区分它是帖子还是主题来解决此问题。

由于帖子和主题使用相同的序列,它们将不再共享任何主键,因此不再需要实体类型来区分两者,主题和帖子中的主键将充当超级键指向媒体表的实体 id。

【讨论】:

    猜你喜欢
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    相关资源
    最近更新 更多