因此,对于代表系统用户的用户类,我有多种访问方法可用于各种数据,如avatar_url,name,about等.我有一个名为getuser的方法,它在db中查找用户(按名称或ID),检索用户行,并用用户类封装它.
但是,每次创建用户类时,是否必须进行查找?如果用户正在查看她的控制面板并想要更改头像并发送xhr,该怎么办?创建用户对象并在用户行甚至不使用检索到的数据时查找用户行并不浪费;但只是想对列的子集进行更改?我怀疑这个查找是否可以忽略不计,因为等待i / o正确的索引?
更一般地说,查询数据库并加载所有模型类的数据以进行任何更改(即使是小的)也不是低效的吗?
我想我应该创建一个单独的表单类(因为每个更改都是通过某种形式),并且具有特定的表单类继承它们,其中将实现这些setter方法.你怎么看?
EX:Class:Form< - Class:Change_password_form< - function:change_usr_pass 我非常感谢有关创建合适设计的一些建议;谢谢.
解决方法 sqlAlchemy ORM有一些可以简化任务的工具.看起来你必须重新发明ORM层中已存在的一些轮子:“我有一个名为getuser的方法,它在db中查找用户(按名称或ID),并封装它与用户类“ – 这是ORM的作用.>使用ORM,您有一个Session,除了其他内容之外,它还可以作为ORM对象的缓存,因此您可以避免每个事务多次加载相同的模型.您会发现无论如何都需要加载User对象来验证请求,因此根本不可能查询表.
>您还可以将某些属性配置为lazily loaded,因此只有在访问它们时才会加载一些很少需要或笨重的属性
>您还可以在单个查询中将关系配置为eagerly loaded,这可以避免您执行数百个小的单独查询.我的意思是,在您当前的设计中,以下代码会启动多少个查询:
for user in get_all_users(): print user.get_avatar_uri() print user.get_name() print user.get_about()
根据您的描述,它听起来可能需要1(num_users * 3)个查询.使用sqlAlchemy ORM,您可以在单个查询中加载所有内容.
结论是:通过主键从数据库中获取单个对象是一个相当便宜的 *** 作,你不应该担心,除非你正在构建像facebook这样大小的东西.您应该担心的是制作数百个小的单独查询,其中一个较大的查询就足够了.这是sqlAlchemy ORM非常好的领域.
现在,关于“创建用户对象并在用户行甚至不使用检索到的数据时查找用户行并不是一件容易的事;但只是想对列的子集进行更改” – 我理解你正在考虑类似的事情
class ChangePasswordForm(...): def _change_password(self,user_ID,new_password): session.execute("UPDATE users ...",new_password) def save(self,request): self._change_password(request['user_ID'],request['password'])
与
class ChangePasswordForm(...): def save(self,request): user = getuser(request['user_ID']) user.change_password(request['password'])
前一个例子只发出一个查询,后者必须发出一个SELECT并构建User对象,然后发出UPDATE.后者可能看起来“效率提高两倍”,但在实际应用中,差异可能微不足道.此外,通常你需要从数据库中获取对象,要么进行验证(新密码不能与旧密码相同),权限检查(用户Molly是否允许编辑Photo#12343的说明?)或日志记录.
如果您认为执行额外查询的区别很重要(数百万用户不断编辑其个人资料图片),那么您可能需要进行一些分析并查看瓶颈所在.
总结以上是内存溢出为你收集整理的model-view-controller – 我应该将此模型类中的功能提取到表单类中吗? (ActiveRecord模式)全部内容,希望文章能够帮你解决model-view-controller – 我应该将此模型类中的功能提取到表单类中吗? (ActiveRecord模式)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)