DB /性能:Django的模型的布局很少是指其父不止一次(DB / performance: la

2019-11-02 08:31发布

我有一个应用程序,是关于呈现虚构的简化城市。

请考虑下面的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模式? 不幸的是,我有没有缓存的经验,但。

它是坚果使用下面的选项?

(二)在城市模型具体FKS,每一个最重要的基本类型

题:

哪个选项是有意义的是什么?
或者是模式一般故障为这种情况的?

特别是关于DB的性能,你有什么建议? 我需要一个完全不同的做法?

请指教! :)

提前致谢!

Answer 1:

如果一个城市可以有不超过各市政府,消防局,警察局,医院,学校等之一,那么我想执行这一最直接的方法是申报每一个作为模型上的字段:

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

这些只是建议...我不知道,如果两种方式都更“正确”



Answer 2:

对于任何人谁是感兴趣:傻我发现了记忆化技术的存在,所以我会用某种形式的应用(A2),裹在城市模型作为许多方便的方法,因为我有“基本的”建筑类型。

这至少一定程度上比具有在两个方向上FKS更少凌乱并让代码为约利益分离(建模在一侧,对其他性能)更清晰。

就快,我做了两个项目来看待学习和可能的借贷东西或直接应用:

  1. Django的memoize的
  2. github.com/husio/django-easycache/

Mayhaps有人也会发现这很有用。



文章来源: DB / performance: layout of django model that rarely refers to its parent more than once