类似Sequelize这种ORM是否有一个总体的设计思路,怎么样去使用它们能达到比较好的效果?

用了关系型数据库好多年(Access/MS SQL Server/MySQL/Sqlite都有或多或少的接触和使用),一直都使用“一句SQL完成一件事”的想法来写。

昨天在写一个新的Node项目,使用了Sequelize这个ORM,在看它的更新数据方法的时候,发现必须得有被更新数据的引用才可以(即先find再update)更新。而且在数据的使用上也有一些和使用SQL不一样的地方,比如第二次获取某条数据可以用“第一次数据.reload()”来完成更新。

我的问题是:类似Sequelize这种ORM是否有一个总体的设计思路,怎么样去使用它们能达到比较好的效果?虽然按之前的思维,想完成一次数据操作就调用一系列API来完成也可以完成任务,但总觉得哪里不对。比如是不是取数据的时候就应该将引用保存在某个地方,然后后续所有操作都直接拿这个引用来操作?

阅读 7.7k
2 个回答

用 OOP 的方法论,访问数据。就是 ORM 的设计哲学。你不在是用 SQL 访问数据库。SQL是底层的,你只需要知道该对象(你数据库的记录)的对应方法是如何访问属性,如何获取,如何遍历,如何存储等等。知道几个方法,之后再也不用 SQL 了。

不一定哦,怎么优化要根据你的 orm 框架是怎么实现的,但是大部分(我觉得好的)orm 框架都是 -- lazy queryset,也就是说只有你 evalute queryset 的值时,sql 才真正被执行。
所以怎么优化看 orm 框架里什么操作能导致 evalute 你的 queryset。

举个例子:

alldata = People.objects.all() // 没执行 sql
white_people = alldata.objects.filter(skin='white') // 没执行 sql
for p in white_people:// evalute queryset white_people, 这才执行 sql
    print(p.name)

另外如果框架有缓存,那么也不用担心 evalute 多次

for p in white_people:// 遍历一般会导致evalute queryset white_people, 这才执行 sql
    print(p.name)
for p in white_people:// 又来一次evalute, 用的是 white_people 的缓存,不会执行 sql
    print(p.name)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题