Postgres中的复合外键

时间:2014-01-24 16:37:41

标签: sql postgresql design-patterns database-design

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

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

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

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

2 个答案:

答案 0 :(得分:1)

我不确定你的问题,但你有设计问题。如果我解释得对,也许你需要这样的设计:

enter image description here

但我不知道如果你不提供你当前的设计。

在这个设计上:

  • CONTENT_TYPE可以是POSTTOPIC
  • MEDIA可以包含1 CONTENT_TYPEPOSTTOPIC)。
  • CONTENT_TYPE可与N MEDIA
  • 相关联

答案 1 :(得分:0)

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

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

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

通过对帖子和主题使用相同的序列,他们不再共享任何主键,因此不再需要实体类型来区分这两者,并且主题和帖子中的主键将充当超级键指向媒体表的实体ID。