改善简单查询的运行时间

时间:2010-11-26 18:42:20

标签: python django database-design

大师:

我有一个非常简单的数据模型,通过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有一个UserC1,一个UserC2和一个日期(除主键外) ,自动整数);一对给定的用户可以拥有多个Interaction s。

我使用2000个随机User s(每个类1000个)填充数据库,当我查询Interaction时,运行时间太慢(大约三秒钟 - 在生产环境中不可接受)。 / p>

我可以采取哪些措施来改善此搜索的运行时间吗?我应该以不同的方式定义Interaction吗?

感谢。

2 个答案:

答案 0 :(得分: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()

为每个User类创建一个新模型和关联表似乎不是一个好的设计。

答案 1 :(得分:0)

您使用外键将C1, C2Users相关联,并将其称为一对多关系。但是,Interaction C1, 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()

看看这是否有帮助......