6

新年快乐!

我有一个模型可以保存数十万条记录。该模型如下所示:

class Transaction(models.Model):
    user = models.ForeignKey(User)
    client = models.ForeignKey(Client)
    amount = models.FloatField()

我想知道某个用户正在处理的所有客户。要获取唯一的客户端 ID,我可以单独使用 Django ORM:

Transaction.objects.filter(user=the_user).distinct('client_id').values_list('client_id', flat=True)

或执行以下操作:

set(Transaction.objects.filter(user=the_user).values_list('client_id', flat=True))

两者都会产生相同的结果。但是考虑到大量记录,哪一个会更快?我知道distinct对数据库的操作相对较慢,但它与 python 相比如何set()

最后,如果涉及到数据库,我的选择是 MySql 和 PostgreSql 用于生产。对于这个特定的操作,他们两者之间会有什么区别吗?

4

1 回答 1

10

我通常使用 orm 函数,它更具可读性并且它在数据库级别上运行,因此实际计算不同值的 RDBMS 也是如此,并且您只需一步即可获得结果。

您可以使用 python 集完成相同的操作,但您需要先带上所有数据集,然后应用 set()。所以你必须执行两步操作才能做到这一点。

在您的第一种情况(orm)中,您只有 I/O 开销,而在第二种情况下,您有 I/O 开销 + 一个函数调用,所以我会使用 ORM 的不同。

于 2013-01-02T03:59:45.077 回答