在 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 的外键仍然更容易阅读和调试。
从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 的外键仍然更容易阅读和调试。