我目前正在Django中构建一个简单的应用程序,并试图找到一个好的模型设计。
在我已阅读的Django documentation和许多blog posts中,建议使用choice
关键字参数。这将在我的(简化)名词模型中实现,如下所示:
class Noun(models.Model):
FEMININE = 0
MASCULINE = 1
NEUTER = 2
COMMON = 3
GENDER_TYPE = (
(FEMININE, "Feminine"),
(MASCULINE, "Masculine"),
(NEUTER, "Neuter"),
(COMMON, "Common"),
)
stem = models.CharField(max_length=200)
gender = models.IntegerField(choices=GENDER_TYPE, default=Noun.COMMON)
当我走过走廊并与数据库管理员朋友谈论如何在数据库中显示枚举时,他承认辩论,但他说他会为每个枚举制作一个表并用外键引用它。这种方法几乎完全映射到以下模型:
class Gender(models.Model):
short_name = models.CharField(max_length=1) # M, F, N, or C
description = models.CharField(max_length=20) # Masculine, Feminine, Neuter, or Common
class Noun(models.Model):
stem = models.CharField(max_length=200)
gender = models.ForeignKey(Gender, on_delete=models.CASCADE)
我试图权衡每种方法的相对优点。以下是我能看出的专业人士和骗子:
第一种方法
第二种方法
所以,我的问题:我错过了一个明显的原因,为什么一种方法无效?如果两种方法都有效,哪种方法更好?
答案 0 :(得分:2)
两种方法都有效。要决定一个,你应该主要考虑两点:你有多少选择,以及他们将来改变的可能性。
因此,如果没有多少选择并且它们不太可能经常更改,请使用选择而不是外键 - 从性能的角度来看会更好。如果有很多选择或经常更改 - 请选择外键。
如果是性别,我会选择。即使他们将来发生变化 - 现有的变化很可能不会受到影响。
答案 1 :(得分:1)
您对这两种方法的利弊理解是正确的。在小型项目的情况下,您可以使用任何方法,而不会有任何问题。但是,如果您希望您的项目足够大,那么您应该注意接下来的两个时刻:
Gender
模型更容易。gender
字段与choices
属性一起使用。这样可以节省您查询不必要的Gender
模型的时间。