我应该在SqlAlchemy中使用relationship()吗?

时间:2013-12-01 20:15:23

标签: mysql database performance memory sqlalchemy

我担心在SqlAlchemy中使用relationship()时的性能。例如,我有两个表:UsersBlogPosts,它们之间的关系是一对多的。如果我使用relationship(),则user.blogSpots将是BlogPost的列表,因此我认为用户(Alex)有100万BlogSpot,哦,user.blogSpots是非常大,因为它包含100万件物品,对吧?如果是的话,它必须从数据库中获取100万个结果行?我认为在现实世界的应用程序中,数据量巨大,性能可能会放缓。

那么relationship()在SqlAlchemy中的好处是什么?使用带有limit子句的普通“sql查询”更好(内存+性能),不是吗?

1 个答案:

答案 0 :(得分:1)

relationship的好处实际上非常简单:列出/添加/删除/更新相关实体。

然而,您所描述的案例是人们应该以非默认方式处理关系的特殊情况之一。我建议您阅读文档中的Working with Large Collections Collection Configuration and Techniques部分。

适用于您的情况将使用dynamic关系,该关系仅返回预先配置的查询,因此您可以根据需要进一步处理它:

  • 应用过滤器
  • 应用限制以仅选择按字段X等排序的前N

这样的事情就是一个例子:

class Users(Base):
    blogSpots = relationship("BlogPosts", lazy="dynamic")
...
user1 = session.query(Users).get(1)
assert user1
top10byDate = users1.blogSpots.order_by(desc(BlogPosts.POSTED_DATE))[:10]
taggedTech = users1.blogSpots.filter(BlogPosts.tags.any(Tag.name == 'tech')[:10]