保持数据库外键一致

时间:2018-11-06 19:58:45

标签: python django database schema database-normalization

我正在尝试使用PostgreSQL数据库编写django应用程序。我的问题可以简化为以下最小示例:

组织

  • 有0 ... N名工人

工人

  • 属于组织

任务

  • 属于组织
  • 被分配给一个人,或者被分配给同一组织内的一名工人

我不确定如何以防止状态不一致的方式设计数据库-由于Worker和Task都需要具有指向其所属组织的外键,因此可能会以不一致的状态结束组织A的一名工人被分配了组织B的一项任务。

我唯一想到的解决方案是验证save方法中的约束:

class Organization(models.Model):
    name = models.CharField(max_length=255)


class Worker(models.Model):
    name = models.CharField(max_length=255)
    organization = models.ForeignKey(Organization, on_delete=models.CASCADE)


class Task(models.Model):
    name = models.CharField(max_length=255)
    organization = models.ForeignKey(Organization, on_delete=models.CASCADE)
    assigned_to = models.ForeignKey(Worker, null=True, on_delete=models.SET_NULL)

    def save(self, *args, **kwargs):
        if self.assigned_to and self.assigned_to.organization != self.organization:
            raise ValidationError('Task and Worker belong in different Organizations.')
        return super(Task, self).save(*args, **kwargs

是否有可能创建一个更好的解决方案,以防止状态不一致?从数据库设计的角度来看,我自己的解决方案似乎不是一个好的解决方案。

0 个答案:

没有答案