2010-11-26 2 views
0

Gurus:Улучшение время выполнения простого запроса

У меня есть очень простая модель данных, относящуюся два различных вида User с помощью Interaction:

# myapp/models.py 
class C1(models.Model): 
user = models.ForeignKey(User) 

class C2(models.Model): 
user = models.ForeignKey(User) 

class Interaction(models.Model): 
c1 = models.ForeignKey(C1) 
c2 = models.ForeignKey(C2) 
date = models.DateField() 

это так, Interaction имеет User класса C1 , a User класса C2 и дата (в дополнение к первичному ключу, автоматически целое); у данной пары пользователей может быть много Interaction.

Я заполнил базу данных 2000 случайными User s (1000 каждый класс), и когда я запрашиваю Interaction, время выполнения слишком медленно (около трех секунд - неприемлемо в производственной среде).

Есть ли что-то, что я могу сделать, чтобы улучшить время выполнения этого поиска? Должен ли я определять Interaction по-другому?

Спасибо.

+0

Каков точный запрос, который вы используете? – 2010-11-26 18:54:48

ответ

4

Если вы хотите сохранить дополнительную информацию, связанную с вашими пользователями, Django предоставляет способ определения связанная с сайтом модель - для этой цели - «профиль пользователя».

Чтобы использовать эту функцию, определите модель с полями для дополнительной информации, которую вы хотите сохранить, или дополнительные методы, которые вы хотели бы иметь, а также добавьте OneToOneField из вашей модели в модель пользователя , Это гарантирует, что для каждого пользователя может быть создан только один экземпляр вашей модели. Например:

# settings.py 
AUTH_PROFILE_MODULE = 'myapp.UserProfile' 

# myapp/models.py 
class UserProfile(models.Model): 
    CLASS_CHOICES = (
     (0, 'Yellow User'), 
     (1, 'Green User'), 
    ) 
    user_class = models.IntegerField(choices=CLASS_CHOICES) 
    user = models.OneToOneField(User) 

class Interaction(models.Model): 
    u1 = models.ForeignKey(User, related_name='u1s') 
    u2 = models.ForeignKey(User, related_name='u2s') 
    date = models.DateField() 

Создание новой модели и связанной таблицы для каждого класса пользователя кажется не очень хорошим дизайном.

0

Вы использовали внешние ключи, чтобы связать C1, C2 с Users, и назвал это отношения с один-ко-многим. Однако связь между не является однозначной, поскольку один Interaction может быть связан со многими Users, а один User также может иметь множество связанных с ним Interactions. Это называется отношениями «многие ко многим» и представлено в Django-модели с использованием models.ManyToManyField.

Так попробуйте изменить файл models.py в -

class Interaction(models.Model): 
    ic1 = models.ManyToManyField(C1) 
    ic2 = models.ManyToManyField(C2) 
    date= models.DateField() 

Смотрите, если это помогает ...

+0

Не могу понять, как все правильно. Несомненно, связь между C1 и C2 - это много-ко-многим, а взаимодействие - это сквозная таблица для этих отношений? – 2010-11-26 18:55:48

+0

, но разве это не лучший способ представить это отношение db? Согласен, что я не уверен в производительности ... – 2010-11-26 18:56:51