У меня есть модель, как это:Модель с большим количеством отношений
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 (значения в этих внешних ключах часто меняются).
Мои вопросы:
- Есть еще один способ смоделировать это при одновременном снижении потерь производительности, которые могут возникнуть?
- Нужно ли беспокоиться об этом? (штраф не достаточно большой, недостаточно внешних ключей/соединений, чтобы вызвать что-то значимое и т. д.)
Найдено: http://stackoverflow.com/questions/173726/when-and-why-are-database-joins-expensive – cdvv7788