2014-01-24 48 views
0

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

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

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

我遇到的问题是,我无法在content_id上创建外键,因为根据content_type,它可能指向两个表中的一个。有没有一种方法可以根据content_type_id列的值设置forgein键来查看适当的表格?

+0

请提供您的餐桌DDL。 – Kuberchaun

+0

闻起来不好的设计。见例如http://stackoverflow.com/questions/13311932/foreign-key-referencing-multiple-tables – leonbloy

回答

1

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

enter image description here

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

这种设计:

  • CONTENT_TYPE可以是POSTTOPIC
  • MEDIA可以有1 CONTENT_TYPEPOSTTOPIC)。
  • CONTENT_TYPE可能与N MEDIA有关。
+0

我遇到的问题是媒体是附加到内容(图片,文档或其他类型的文件)。因此,content_id也需要成为表的附属关键字,并附加到发布ID或主题ID。由于帖子表和主题表可以有重叠的ID,我希望能够使用content_type_id作为显示它是帖子还是主题的方式。但我不知道是否有一种方法,我可以有一个forgien关键约束根据另一列的值检查其有效性。 – Jake

+0

要区分帖子或主题,您可以在“CONTENT_TYPE”上添加一列来执行此操作。您可以使用布尔值或更好的整数,以便将来能够充分利用更多内容类型(1表示主题,0表示后期表达)。 – carexcer

0

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

例如,在创建帖子之前,它使用sequental id作为主键(1,2,3,4 ...),并且在创建主题时,会发生相同的事件(1, 2,3,4,...)。

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

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