Django数据建模:外键还是硬编码?

时间:2014-05-07 17:19:38

标签: python django django-models foreign-keys data-modeling

假设我有一个动物表,它有两个属性名称和类型,而类型可以是:'dog','cat'等。这里有两种方法在Django中实现它:一个类型是一个ForeignKey到AnimalType:

class Animal(models.Model):
    name = models.CharField(max_length=10)
    type = models.ForeignKey(AnimalType)

另一种方法是将类型作为预定义选项,将在导入的模块中定义:

class Animal(models.Model):
    name = models.CharField(max_length=10)
    type = models.CharField(
        max_length=10,
        choices=ANIMAL_TYPE_CHOICES
    )

后者(预定义选项)对我来说似乎更有效,因为类型永远不会被用户交互动态更新,如果需要添加新类型,它将由开发人员添加,即代码将被更新而不是数据库。

但是,我想知道这是否是一个好/可接受的做法?或者我应该为这样的“静态”条目浪费一个单独的数据库表,还要支付由db访问引起的额外时间? 感谢。

3 个答案:

答案 0 :(得分:2)

第一种方式的优势在于您无需触摸代码即可添加新类型的动物。

当然,有人使用你的应用程序。

添加新的动物类型是微不足道的,例如,您不应该在生产服务器上部署工作代码,只需添加动物类型。

如果由于您的数据库在开始使用该应用程序时出现问题而导致出现问题,并且因此您没有任何动物类型,请尝试使用Django灯具:Providing initial data for models

答案 1 :(得分:1)

我更喜欢第二种方式。 如果您不需要从管理面板编辑类型,并且总是会根据代码中的更改进行更改,则不需要使用ForeignKeys和单独的表。

如果是ForeignKey,您将在数据库级别进行额外的完整性检查。 例如,如果删除某种类型并且不想将其保留在DB中,它会很有用。

答案 2 :(得分:1)

由于性能原因,我更喜欢选择字段。即使潜在的选择增加,只要功能只是一个选择选择,就没有理由创建额外的表