DB/性能:django模型的布局,很少多次引用其父模型
我有一个关于呈现虚拟简化城市的应用程序DB/性能:django模型的布局,很少多次引用其父模型,django,performance,schema,django-views,Django,Performance,Schema,Django Views,我有一个关于呈现虚拟简化城市的应用程序 请考虑以下Django模型: class City(models.Model): name = models.CharField(...) ... TYPEGROUP_CHOICES = ( (1, 'basic'), (2, 'extra'), ) class BldgType(models.Model): name = models.CharField(...) group = models.Inte
请考虑以下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) 在某些视图中,所有建筑(无论城市等)都将根据不同的标准进行过滤,例如,其他标准
问题/关注:
在city\u detail
视图中,我必须在任何“额外”类型的建筑上循环,这是正常的
但我不知道如何有效地检索城市的“医院”建筑,这是“基本”类型,因此我必须为每个城市这样做,因为每个城市中都有一个这样的医院(这在城市创建时得到保证)
最多将有十几种“基本”建筑类型,其中大约一半将一直呈现
我倾向于在城市模型上编写方便的方法,我面临三种选择:
(A1)通过尝试
并索引:.filter(…)[0]
(A2)通过尝试和获取(…)
(A3)通过尝试和过滤器(…).latest()
但这些似乎都不优雅。
或者这三个选项中的一个适合与某种缓存相结合,比如在用户
模型上的Django的get_profile()
方法中?不幸的是,我还没有缓存方面的经验
使用以下选项是否有问题
(B) 城市模型中的特定FK,最重要的基本类型各一个
问题:
哪个选项最有意义?
或者对于这种情况,模式通常是错误的
特别是关于数据库性能,您有什么建议?我需要一个完全不同的方法吗
请告知!:)
提前谢谢 如果一个城市的市政厅、消防局、警察局、医院、学校等每一个都不能超过一个,那么我认为执行这一点最直接的方法是在模型上声明每一个都是一个字段:
class City(models.Model):
name = models.CharField(...)
city_hall = models.ForeignKey(Building)
fire_station = models.ForeignKey(Building)
# ... et cetera
如果你在你的城市模型中发现这太“凌乱”,你可以考虑有一个中间<代码> CuthSudio模型:
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\u station
这些只是建议。。。对于任何感兴趣的人来说,我不确定这两种方法是否更“正确”:愚蠢的我发现了记忆技术的存在,因此我将使用应用于(A2)的某种形式,在城市模型上使用与我的“基本”建筑类型一样多的方便方法
这至少比在两个方向上使用FK要简单一些,并且让代码更清楚地了解利益的分离(一边建模,另一边性能)
在快速的过程中,我制定了两个项目,以供学习和可能的借出材料或直接申请:
github.com/husio/django-easycache/
也许有人会发现这一点也很有用。+1我同意这个解决方案——不过,作为记录:建议您使用带有unique=True
参数的ForeignKey
,而不是OneToOne=D@Jim我不认为是这样;这是0.96左右的建议,当时“OneToOne的语义很快就会改变”,但现在没有理由不使用OneToOne。嗨!感谢您的回答和评论,非常感谢!吉姆,你说得对,我还担心“模特乱七八糟”;)然而,我目前对CityBuildings模型的问题是,除了City模型之外,“没有其他人”使用它,因此通过OneToOneField引入了不必要的额外连接,这将使我回到上面的选项(B),即您答案的第一个版本。关于性能问题,即选项(B)是否仍比任何选项(A)更好?同样,我也不是缓存可能性的专家。谢谢!