0

私は架空の簡略化された都市を提示することについてのアプリを持っています。

次の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のパフォーマンスに関して、あなたは何を提案しますか?まったく異なるアプローチが必要ですか?

お知らせ下さい!:)

前もって感謝します!

4

2 に答える 2

1

都市が市役所、消防署、警察署、病院、学校などのそれぞれを1つしか持てない場合、これを実施する最も簡単な方法は、モデルのフィールドとしてそれぞれを宣言することだと思います。

class City(models.Model):
    name = models.CharField(...)
    city_hall = models.ForeignKey(Building)
    fire_station = models.ForeignKey(Building)
    # ... et cetera

Cityモデルでこれが「乱雑」すぎる場合は、中間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

これらは単なる提案です...どちらの方法がより「正しい」かどうかはわかりません

于 2009-11-30T19:23:58.613 に答える
0

興味のある人のために:愚かな私はメモ化手法の存在を発見したので、(A2)に適用された何らかの形式を使用し、「基本的な」建物タイプと同じ数の便利な方法を都市モデルにラップします。

これは、2方向にFKを配置するよりも少なくとも多少面倒ではなく、関心の分離(一方のモデリング、もう一方のパフォーマンス)についてコードをより明確にすることができます。

簡単に言えば、私は2つのプロジェクトを作成して、学習し、場合によっては物を貸したり、直接適用したりすることを検討しました。

  1. django-メモ化
  2. github.com/husio/django-easycache/

たぶん誰かがこれも役に立つと思うでしょう。

于 2009-12-02T14:27:08.047 に答える