我开始学习django,已经有一个问题:
如果表具有相似的字段,哪种模型创建更好?
1)Standart方式形式官方教程之类
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
class Restaurant(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
serves_hot_dogs = models.BooleanField()
serves_pizza = models.BooleanField()
如您所见,两个模型具有相同的名称和地址字段。我在https://docs.djangoproject.com/en/1.6/topics/db/models/#multi-table-inheritance中发现了像这样的多表语言:
2)
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
class Restaurant(Place):
serves_hot_dogs = models.BooleanField()
serves_pizza = models.BooleanField()
正如doc所说:尽管数据将存储在不同的数据库表中,但Place的所有字段也将在Restaurant中可用。
那么,这两者之间有什么主要区别吗?我应该使用哪一个?
最佳答案
在这种情况下,我认为您应该使用继承(解决方案2)。
因为Restaurant
是特殊的Place
,这意味着Restaurant的字段为name
和address
,此外,Restaurant的字段为serves_hot_dogs
和serves_pizza
。
考虑到以上描述,所有解决方案都是合理的。但是,Restaurant
是Place
,Restaurant
必须可以作为Place
处理。
在解决方案1中,Restaurant
和Place
是分开的,您不能将Restaurant
作为Place
处理。(仅考虑OOP)
另一方面,在solution1中,如果我用地址A保存一个Place
,并添加一个具有相同地址的Restaurant
。我在数据库中两次保存了相同的地址,这导致了冗余和不一致。
这个问题与OOP中的Composition和Inheritance不同。