对于我开发的一些应用程序(后来就忘了),我一直在编写纯SQL,主要是针对MySQL的.虽然我在python中使用过ORMs,比如SQLAlchemy,但我并没有坚持多久.通常是文档或复杂性(在我看来)阻碍了我.

我是这样看的:使用ORM实现可移植性,如果只是使用一种数据库,则使用普通SQL.我真的在寻找关于在开发需要数据库支持的应用程序时何时使用ORM或SQL的建议.

考虑一下,与使用ORM相比,只使用轻量级包装器来处理数据库不一致性要好得多.

推荐答案

ORMs有一些很好的特性.它们可以处理将数据库列复制到对象字段的大量繁杂工作.它们通常负责将语言的日期和时间类型转换为适当的数据库类型.它们通常通过实例化嵌套对象来非常优雅地处理一对多关系.我发现,如果你在设计数据库时考虑到ORM的优缺点,就可以节省大量进出数据库的工作.(如果你需要映射多态性和多对多关系,你会想知道它是如何处理这些关系的.正是这两个领域提供了大多数"阻抗失配",因此有人将其称为"计算机科学的越南".)

对于事务性应用程序,例如,您发出请求,获取一些对象,遍历它们以获取一些数据并将其呈现在网页上,性能税很小,在许多情况下,ORM可以更快,因为它会缓存以前看到的对象,否则会多次查询数据库.

对于报告繁重的应用程序,或者每个请求处理大量数据库行的应用程序,ORM税要重得多,它们所做的缓存会变成一个巨大的、无用的内存占用负担.在这种情况下,简单的SQL映射(LinQ或iBatis)或在精简DAL中手工编码的SQL查询就是一种 Select .

我发现,对于任何大型应用程序,您都可以同时使用这两种方法.(ORM用于简单的CRUD,SQL/thin DAL用于报告).

Sql相关问答推荐

Postgres:对包含数字的字符串列表进行排序

替换上一个或下一个值中的空值并添加其价格日期

用于过滤嵌套对象或数组中的JSON数据的WHERE条件

如何使用SQL生成数据的滚动3天总和

删除行而不使数据库超载

使用 union 的有序结果获取行数

AdventureWorks 查询

试图找到两个身份列表的交集(列表的长度不同),但获取列 id 不明确?

我可以在 T-SQL (SQL Server) 的函数内使用 OPTION 子句吗?

特殊条件计算小计

获取上个月和上一年的值

SQL 如何根据当前事件和下一个事件确定操作的持续时间?

如何从三个连接表中获取数据,并始终显示第一个表中的数据,以及第三个表中的空值或现有记录?

使用 SQL 计算一年中任意 3 个月期间的总成本

REGEXP_SUBSTR使用方法

Teradata 多个进程的最大进程结束时间捕获

我需要遍历权重值表并确定每个权重是否有效

为数组中的每个元素从表中收集最大整数

Postgres 条件求和函数

如何根据 Amazon Athena 中的多个列值删除重复行?