我正在尝试使用PostgreSQL数据库编写django应用程序。我的问题可以简化为以下最小示例:
组织
工人
任务
我不确定如何以防止状态不一致的方式设计数据库-由于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
是否有可能创建一个更好的解决方案,以防止状态不一致?从数据库设计的角度来看,我自己的解决方案似乎不是一个好的解决方案。