【问题标题】:How to enforce single direction uniqueness in postgres?如何在 postgres 中强制执行单向唯一性?
【发布时间】:2018-02-23 07:44:31
【问题描述】:

假设我有一个job_assignment 表,其中包含workerjob 表中的worker_idjob_id

一个工人可以有许多工作,但一个工作只能分配给一个工人。有没有办法在 postgres 中确保这一点?

如果我输入UNIQUE(worker_id, job_id),这将只是一对一的映射。我已经阅读了UNIQUE FOREIGN KEY,但我仍然不确定这是否是正确的方法。

【问题讨论】:

  • 最简单的方法是去掉job_assignment,只在job中存储一个worker_id

标签: sql postgresql database-design one-to-many


【解决方案1】:

这不应该使用中间job_assignment 表来建模——这将是建模多对多关系的正确方法。

相反,您应该将外键列 worker_id 添加到 job。这样可以保证一个工作只能属于一个工人。

如果您想将某些字段存储在job_assignment 中,则可以改为将job_assignment_id 外键添加到job 并将worker_id 外键添加到job_assignment。但我想说你不妨将这些数据添加到job。创建一个反映现实的数据模型很好,但您的模型还应该允许您的 SQL 查询简单,不需要更多的连接。

【讨论】:

  • 我创建这个中间表的原因是因为还有其他 job_assignment 特定的数据,对我来说,这个分​​配数据似乎更多的是 job_assignment 属性而不是 job 属性。如果是这样,还很糟糕吗?
  • 我试图在扩展答案中解决该评论。
【解决方案2】:

我不会为此使用中间表,但您可以通过将UNIQUE(job_id) 约束添加到job_assignment 来完成您的要求。

这确保每个jobjob_assignment 中最多列出一次,因此最多分配给一个工人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-11
    • 2011-01-18
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多