Django数据库设计 - Null外键

时间:2011-01-28 15:42:26

标签: django database-design

我有一个带有Person模型的Django模型:

class Person(models.Model):
  # Personal details
  first_name = models.CharField(max_length=50)
  middle_name = models.CharField(max_length=50, blank=True, null=True)
  last_name = models.CharField(max_length=50)
  gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
  date_of_birth = models.DateField()

  # Address
  street_address = models.CharField(max_length=50)
  suburb = models.CharField(max_length=30)
  postcode = models.CharField(max_length=4)
  state = models.CharField(max_length=3, choices=STATE_CHOICES)

  #Contact Details
  email = models.EmailField()

  # Family
  spouse = models.ForeignKey('self', null=True, blank=True)
  children = models.ManyToManyField('self', null=True, blank=True)

  home_church = models.ForeignKey('Church', null=True, blank=True)

“middle_name”字段可以为空,我认为没有办法避免这种情况,是吗?

但是,我的配偶也有一个可以为null的ForeignKey,为他们的孩子提供一个递归的ManyToManyField,为教堂设置一个可以为null的ForeignKey(如果相关)。

我的问题 - 首先,目前对可空外键的共识是什么?我应该在这里允许它,还是应该创建某种“无人”或“未分配”模式来代表没有配偶/家庭教会?

还是有其他方法可以在Django中重新设计这个设计以适应这个吗?

如果我继续使用null FK,那么Django中是否有任何需要注意的注意事项? (左连接?)

干杯, 维克多

3 个答案:

答案 0 :(得分:0)

Null非常好。在python代码None中将代表Null

你应该知道的一件重要事情是,如果你删除教堂,django会执行级联,你教会的人也会被删除。因此,在删除教堂之前,你需要为教堂里的每个人在教堂场地上设置Null。

Django 1.3引入了on_delete参数,这使得这很简单。

答案 1 :(得分:0)

大多数DBMS实现的可空外键在逻辑上没有多大意义。不同DBMS处理它们的方式之间也存在一些不一致。因此,可以为空的外键很可能导致错误的结果。只需将有问题的属性移动到新表中,并且只有在有值填充该表时填充该表,就可以轻松避免它们。

答案 2 :(得分:0)

当外键标记为null = True时,Django将使用LEFT OUTER JOIN处理JOIN,至少使用Oracle数据库AFAIK,因此没有问题。