문제

가상의 단순화 된 도시를 제시하는 앱이 있습니다.

다음 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 보기, 나는 "추가"유형의 건물을 고리해야합니다.

그러나 나는 "기본"유형 인 도시의 "병원"건물을 효율적으로 검색하는 방법을 잘 모르겠으므로, 각 도시에 정확히 하나의 병원이 존재하기 때문에 모든 도시에 대해이 작업을 수행해야합니다 (이것은 도시 창조 시간에 보장됩니다. ).

최대 12 개의 "기본"건물 유형이있을 것이며, 그 중 약 절반은 항상 제시 될 것입니다.

나는 도시 모델에 편의 방법을 작성하는 경향이 있으며 세 가지 옵션에 직면 해 있습니다.

(A1) 비아 try 그리고 색인 : .filter(...)[0]

(a2) 비아 try 그리고 .get(...)

(a3) 비아 try 그리고 .filter(...).latest()

그러나 그 중 어느 것도 우아하게 보이지 않습니다. 또는이 세 가지 옵션 중 하나입니다. get_profile() 방법에 대한 방법 User 모델? 불행히도, 나는 아직 캐싱에 대한 경험이 없습니다.

다음 옵션을 사용해야합니까?

(b) 도시 모델의 특정 FK, 가장 중요한 기본 유형 각각에 대해 하나씩

의문:

어떤 옵션이 가장 의미가 있습니까?
아니면 스키마가 일반적으로 이러한 종류의 시나리오에 결함이 있습니까?

특히 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

이것들은 단지 제안입니다 ... 어느 쪽이든 더 "올바른지"확실하지 않습니다.

다른 팁

관심있는 사람이라면 누구나 : Silly Me는 Memoization Technique의 존재를 발견 했으므로 "기본"건물 유형이있는 것처럼 도시 모델의 많은 편의 방법으로 싸여있는 (A2)에 어떤 형태의 형태를 사용할 것입니다.

이것은 FK를 두 방향으로 두는 것보다 적어도 다소 지저분하며 코드가 관심 분리에 대해 더 명확하게 할 수 있습니다 (한쪽의 모델링, 다른 쪽의 성능).

빨리, 나는 학습과 대출을 받거나 직접 적용 할 수있는 두 가지 프로젝트를 만들었습니다.

  1. Django-Memoize
  2. github.com/husio/django-esycache/

누군가가 누군가도 유용하다는 것을 알게 될 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top