哪一个更好?ORM的distinct()或python set()

ppe*_*rid 2 python mysql django postgresql

新年快乐!

我有一个模型,可以容纳成千上万的记录.该模型如下所示:

class Transaction(models.Model):
    user = models.ForeignKey(User)
    client = models.ForeignKey(Client)
    amount = models.FloatField()
Run Code Online (Sandbox Code Playgroud)

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

Transaction.objects.filter(user=the_user).distinct('client_id').values_list('client_id', flat=True)
Run Code Online (Sandbox Code Playgroud)

或者执行以下操作:

set(Transaction.objects.filter(user=the_user).values_list('client_id', flat=True))
Run Code Online (Sandbox Code Playgroud)

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

最后,如果它归结为数据库,我的选项是MySql和PostgreSql用于生产.对于这个特定的操作,他们俩之间会有什么不同吗?

ife*_*inm 5

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

您可以使用python集完成相同的操作,但是您需要首先使用所有数据集,然后应用set().因此,您必须执行两步操作才能执行相同操作.

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

  • 更重要的是,在第二种情况下,您需要将更多数据从数据库传输到Python,这可能会增加I/O开销.当然,好处是DB正在解除一些工作,但希望DB的"独特"功能与Python的"set"一样高效或更有效. (3认同)