私は架空の簡略化された都市を提示することについてのアプリを持っています。
次の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)各都市には、都市ごとに1回だけ発生する「基本」タイプの特定の建物(例:市庁舎、消防署、警察署、病院、学校)と、ダンスなどの「追加」タイプの建物が数十あります。クラブ。
(2)特定のビューでは、すべての建物(都市などに関係なく)は、さまざまな基準に従ってフィルタリングされますother_criterion
。
問題/懸念:
ビューでは、city_detail
「余分な」タイプの建物をループする必要がありますが、これは問題なく正常です。
しかし、「基本」タイプの都市の「病院」の建物を効率的に取得する方法がわからないため、各都市にそのような病院が1つだけ存在するため、とにかくすべての都市でこれを実行する必要があります(これは都市の作成時に保証されます) )。
最大で12種類の「基本的な」建物タイプがあり、そのうちの約半分が常に提示されます。
Cityモデルで便利なメソッドを作成する傾向があり、次の3つのオプションに直面します。
(A1)ビアtry
とインデックス:.filter(...)[0]
(A2)経由try
および.get(...)
(A3)経由try
および.filter(...).latest()
しかし、それらのどれもエレガントに見えません。または、これら3つのオプションの1つを、モデルでのDjangoのget_profile()
方法のように、ある種のキャッシュと組み合わせるのが適切ですか?User
残念ながら、私はまだキャッシュの経験がありません。
次のオプションを使用するのは難しいですか?
(B)都市モデルの特定のFK、最も重要な基本タイプごとに1つ
質問:
どのオプションが最も理にかなっていますか?
それとも、この種のシナリオではスキーマに一般的に欠陥がありますか?
特にDBのパフォーマンスに関して、あなたは何を提案しますか?まったく異なるアプローチが必要ですか?
お知らせ下さい!:)
前もって感謝します!