【问题标题】:Conditional join in PostgresPostgres 中的条件连接
【发布时间】:2018-12-26 11:49:46
【问题描述】:

我有一个带有字段的 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。我阅读了文档,但没有意识到如何去做。 提前致谢。

【问题讨论】:

    标签: sql postgresql join database-design


    【解决方案1】:

    我不建议这样的设计,因为它排除了使用外键进行完整性控制。 (您可能需要研究实体子类化。)看起来好像您有一个规范化问题,因为 action_id 似乎在功能上确定 action 而不是超级键。

    【讨论】:

      【解决方案2】:

      这是处理“单”关系的可行结构。正如 Jon 指出的那样,您不能声明外键关系。太可惜了,所以这不是一个很好的解决方案。

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

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

      【讨论】:

      • 那个表继承有点有趣,但是从这个例子中我看不出它与“手动”相比有什么好处,考虑到它的缺点。你有这方面的经验吗?
      • @JonHeggland 。 . .与“手动执行”相比的一个优势是您可以正确声明外键关系。
      • 对我来说似乎正好相反。手动方法——cities{name,population,altitude}capitals{name,state}、从首都到城市的外键(假设 {name}作为键)——没有 5.9.1 中列出的任何警告,并且可以使用标准 SQL 来启动。跨度>
      猜你喜欢
      • 1970-01-01
      • 2022-08-16
      • 2021-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      相关资源
      最近更新 更多