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

请考虑以下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),包裹在许多方便的方法上的城市模式,因为我们的"基本"建设类型。

这至少是有点小混乱比有驻在两个方向,而让这些代码被更清楚的关于分离的利益(模型在一个侧面,表现在其他)。

在快速的,我做了两个项目看起来在为学习和可能的贷款东西或施加直接:

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

Mayhaps有人会发现这很有用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top