有条件地加入Postgres

时间:2018-07-18 14:01:05

标签: sql postgresql join database-design

我有一个带有字段的Postgres表log_actions:

id -操作ID
userId
操作-BAN,ADD_PROCESS等...
action_id

action_id是以下表之一的ID:
user_bans for action = BAN
user_processes for action = ADD_PROCESS

  1. 我的第一个问题是拥有这种架构是可以的。我的意思是action_id字段,其中包含不同表的ID。
  2. 如果是,那么我将不胜感激如何有条件地加入log_actions,user_bans,user_processes。我阅读了文档,但不知道如何去做。 预先感谢。

2 个答案:

答案 0 :(得分:1)

我建议不要使用这种设计,因为它会阻止使用外键进行完整性控制。 (您可能希望研究实体子类化。)似乎您还有一个规范化问题,因为action_id似乎在功能上确定了action而不是超键。

答案 1 :(得分:1)

这是用于处理“一个”关系的可行结构。正如乔恩指出的那样,您不能声明外键关系。真可惜,这不是一个很好的解决方案。

Postgres提供表继承。这可能正是您想要的。 “动作”表都可以从actionid表继承actions。这可以用于联接。每个表都可以有其自己的特定列(和外键关系)。

有关继承的更多信息,请参考documentation