在 Django 中,如果大多数外键都是空白,那么设置可选外键的最佳方法是什么?

In Django, what's the best way to set up optional foreign keys if most of the foreign keys are blanks?

this one这样的问题,我知道在django中制作可选外键的推荐方法是设置null=True, blank=True。这样就不用设置外键的值了。

如果模型中经常使用外键,这对我来说似乎没问题。但是,如果大多数外键都是空值,那么这不会违反 first normal form 并造成大量浪费 space 吗?

当然,数据库中空值的主题 may be controversial,但我仍然想知道如果我知道外键是稀疏的,我应该如何在 Django 中设置可选外键。 Django 是否已经考虑到这一点?我应该为这种关系创建一个单独的模型吗?在Django的设计中有没有考虑到这一点?

谢谢。

可以使用第三个table模拟一个可为空的外键:

class City(models.Model):
    name = models.CharField(max_length=80)

class Person(models.Model):
    name = models.CharField(max_length=80)

class PersonCity(models.Model):
    person = models.ForeignKey(Person, unique=True)
    city = models.ForeignKey(City)

这样,您只会在 table PersonCity 中为已知 City 的人创建一行。要访问给定人员的城市,您将使用:

city = person.personcity_set().first().city

您可以创建一个自定义管理器来缩短此语法并检查 null personcity_set 我为了举例而没有这样做,但我个人认为创建一个可为 null 的外键仍然更容易阅读和调试。