2010-11-26 54 views
0

大師:提高運行時間

我通過Interaction涉及兩種不同的User一個非常簡單的數據模型:

# 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() 

所以,一個InteractionC1類的User ,類C2User和日期(除了主鍵以外,自動爲整數);給定的一對用戶可以有很多Interaction

我使用2000隨機User s(每個類1000個)填充數據庫,並且當我查詢Interaction時,運行時間太慢(大約3秒 - 在生產環境中不可接受)。

我能做些什麼來改善此搜索的運行時間嗎?我應該以不同的方式定義Interaction嗎?

謝謝。

+0

什麼是您正在運行的確切查詢? – 2010-11-26 18:54:48

回答

4

如果你想存儲與用戶的其他信息,Django提供了一個方法來指定一個特定於現場的相關模型 - 稱爲「用戶配置文件」 - 用於此目的。

要使用此功能,請定義一個模型,其中包含您希望存儲的附加信息的字段,或者您希望提供的附加方法,還可以將OneToOneField從模型添加到User模型。這將確保您的模型只能爲每個用戶創建一個實例。例如:

# 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, C2Users關聯,並將其稱爲一對多關係。然而,InteractionC1, C2之間的關係不是一對多的,因爲一個Interaction可以與許多Users相關聯,並且一個User也可以具有許多與其關聯的Interactions。這稱爲多對多關係,並使用models.ManyToManyField在Django模型中表示。

所以試着改變你的models.py文件 -

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

看看這有助於...

+0

根本看不出這是怎麼回事。 C1和C2之間的關係當然是多對多的,Interaction是這種關係的直通表? – 2010-11-26 18:55:48

+0

但是這不是一種更好的方式來表示這種數據庫關係嗎?同意,我不知道性能...... – 2010-11-26 18:56:51