2015-07-06 6 views
1

У меня есть модель, как это:Модель с большим количеством отношений

class Property(models.Model): 
    rsa = models.ForeignKey(settings.AUTH_USER_MODEL) #Real State Agency 
    agents = models.ManyToManyField(Agent) 
    title = models.CharField(max_length=250, blank=False, null=False, verbose_name=_('Title')) 
    slug = AutoSlugField(populate_from='title', unique=True, db_index=True) 
    date_created = models.DateTimeField(auto_now_add=True) 
    date_updated = models.DateTimeField(auto_now=True) 
    country = models.ForeignKey(PropertyCountry, null=False) 
    state = models.ForeignKey(PropertyState, null=False) 
    city = models.ForeignKey(PropertyCity, null=False) 
    neighborhood = models.CharField(max_length=250, default='') 
    neighborhood_alias = models.CharField(max_length=250, blank=True, default='') 
    address = models.CharField(max_length=150, blank=True, default='') 
    phone = models.CharField(max_length=20, default='') 
    contact_email = models.EmailField(max_length=250, default='') 
    price = models.IntegerField(default=0, null=False) 
    price_admin = models.IntegerField(default=0, null=False) 
    area = models.IntegerField(default=0, null=False) 
    private_area = models.IntegerField(blank=True, default=0, null=False) 
    bedrooms = models.IntegerField(blank=True, default=0, null=False) 
    bathrooms = models.IntegerField(blank=True, default=0, null=False) 
    property_type = models.ForeignKey(PropertyType, null=True) 
    type_offer = models.ForeignKey(OfferType, null=True) 
    status = models.ForeignKey(Status, blank=True, null=True) 
    antiquity = models.ForeignKey(YearsOld, blank=True, null=True) 
    number_floors = models.IntegerField(default=1, blank=False, null=False) 
    state_property = models.ForeignKey(StateProperty, null=True) 
    comment = models.TextField(blank=True, default='', verbose_name=_('Comment')) 
    parking_spaces = models.PositiveSmallIntegerField(blank=True, default=0, null=False) 
    weather = models.ForeignKey(WeatherType, blank=True, null=True) 
    stratus = models.IntegerField(default=-1, blank=True, null=False) 
    address_view = models.ForeignKey(AddressView, null=True) 

Где большинство из этих внешних ключей являются чем-то вроде:

class PropertyType(models.Model): 
    name = models.CharField(max_length=50, default='') 
    id_something_a = models.IntegerField(default=-1, blank=False, null=False) 
    id_something_b = models.IntegerField(default=-1, blank=False, null=False) 

Как вы можете видеть, много полей либо иностранного ключа или многих для многих. Если я хочу получить все данные для своего свойства, мне понадобится много соединений для этого, что, я думаю, может стать медленным в конечном итоге.

В качестве альтернативы, в этом случае, я могу использовать поля выбора и отображать значения в python (значения в этих внешних ключах часто меняются).

Мои вопросы:

  • Есть еще один способ смоделировать это при одновременном снижении потерь производительности, которые могут возникнуть?
  • Нужно ли беспокоиться об этом? (штраф не достаточно большой, недостаточно внешних ключей/соединений, чтобы вызвать что-то значимое и т. д.)
+0

Найдено: http://stackoverflow.com/questions/173726/when-and-why-are-database-joins-expensive – cdvv7788

ответ

0

Мне нравится держать все как можно более нормальным, пока есть боли. Затем я оптимизирую для основных случаев использования, де-нормализуя по мере необходимости. Не забывайте, что вы можете бросить больше аппаратного обеспечения в проблему и увидеть хорошие результаты. Тем не менее, это действительно полоса.

Если ваши соединения находятся между массивными таблицами, тогда есть основания для беспокойства. Я попытался бы избежать необходимости получать все данные сразу. Уменьшите количество запросов, чтобы уменьшить время запроса. Однако, если вы делаете дамп данных, это займет время.

В принципе, мой подход позволяет сохранять архитектурное звучание, пока они не станут проблемой. Затем оптимизируйте, где это необходимо, сделайте вещи загруженными кусками и увеличьте RAM/CPU/Hardware. Я использовал этот подход в наборах данных в диапазоне 10 ГБ, где в миллионах есть 6+ таблиц. У меня никогда не было стола с более чем 50 миллионами, поэтому я не могу говорить с огромными наборами данных.

+0

В этом конкретном случае единственной таблицей, которая будет расти, является свойство ... другие это всего лишь небольшие таблицы с максимальным количеством столбцов 6, и я не ожидаю более 200 строк. Насколько большой может быть наказание по этому делу? – cdvv7788

+0

Наверное, пренебрежимо мало. – schillingt

Смежные вопросы