DB/性能:布django的模式,很少提到其父母多次
-
10-07-2019 - |
题
我有一个应用程序,是关于提出虚构的简化城市。
请考虑以下Django模型:
class City(models.Model):
name = models.CharField(...)
...
TYPEGROUP_CHOICES = (
(1, 'basic'),
(2, 'extra'),
)
class BldgType(models.Model):
name = models.CharField(...)
group = models.IntegerField(choices=TYPEGROUP_CHOICES)
class Building(models.Model):
created_at = models.DateTimeField(...)
city = models.ForeignKey(City)
type = models.ForeignKey(BldgType)
other_criterion = models.ForeignKey(...)
class Meta:
get_latest_by = 'created_at'
解释,选择这个装置:
(1)每个城市都有某些建筑物的一个"基本"型而发生的正是一旦每个城市(例:市政府、消防局、警察局、医院、学校)和可能数十个建筑物的"额外"的类型,例如舞蹈俱乐部。
(2)在某些意见,所有建筑物(无论城市,等等。) 要过滤根据不同的标准,例如, other_criterion
.
问题/关注:
在一个 city_detail
看,我会回路超过任何建筑物的"额外"的类型,这是确定和正常的。
但我不知道该如何有效地检索该城市的"医院"建筑,它是"基本"型,所以我必须这样做对于每个城市无论如何,因为正是一个这样的医院存在的在每个城市(这是确保在城市设立时间)。
将有至多一打的"基本的"建筑类型,其中约一半将提交所有的时间。
我倾向于编写方便方法在城市的模式,我的脸三个选项:
(A1)通过 try
和索引: .filter(...)[0]
(A2)通过 try
和 .get(...)
(A3)通过 try
和 .filter(...).latest()
但没有这些看似优雅。或是一个这三个选项的良好结合的某种缓存,就像在Django get_profile()
方法上的 User
模式?不幸的是,我没有经验高速缓存。
是坚果使用以下选择吗?
(B)具体的驻在的城市模式,每个最重要的的基本类型
问题:
这项有意义的最?
或是一架构通常错误的对这种情况?
特别是关于DB性能,你有什么建议?我需要一个完全不同的方法?
请提醒!:)
在此先感谢!
解决方案
如果一个城市可以有不超过一个每个市政府、消防局、警察局、医院、学校等。然后我想到的最直接的方式强制执行,这是宣布每一作为一个领域,在模型:
class City(models.Model):
name = models.CharField(...)
city_hall = models.ForeignKey(Building)
fire_station = models.ForeignKey(Building)
# ... et cetera
如果你找到这个过"混乱"在你的城市模式,可以考虑具有中间 CityBuildings
模型:
class CityBuildings(models.Model):
city_hall = models.ForeignKey(Building)
fire_station = models.ForeignKey(Building)
# ... et cetera
class City(models.Model):
name = models.CharField(...)
buildings = models.OneToOneField(CityBuildings)
然后你请参阅建筑物作为,例如, city.buildings.fire_station
这些只是建议...我不知道,如果任何一种方式是更"正确"
其他提示
任何人有兴趣:愚蠢的我发现了存在的性记忆化的技术,所以我将用一些形式适用于(A2),包裹在许多方便的方法上的城市模式,因为我们的"基本"建设类型。
这至少是有点小混乱比有驻在两个方向,而让这些代码被更清楚的关于分离的利益(模型在一个侧面,表现在其他)。
在快速的,我做了两个项目看起来在为学习和可能的贷款东西或施加直接:
- django memoize
- github.com/husio/django-easycache/
Mayhaps有人会发现这很有用。