什么是ORM?
ORM结构:Object Relational Mapping,目标-联系-映射,所以说ORM结构便是用面向目标的方式和现在的联系型数据库做匹配。
为什么会有ORM?
它处理了目标和联系型数据库之间的数据交互问题。
1、事务代码中手写SQL简略犯错
而有了 ORM 技能以后,只要提早装备好目标和数据库之间的映射联系,ORM 就可以主动生成 SQL 句子,并将目标中的数据主动存储到数据库中,整个进程不需求人工干预。 在 node 中,ORM 一般运用 类 或者注解来装备目标和数据库之间的映射联系。
2、字段类型的静态检查
Int number ‘2222’
比如我数据库界说了一个id字段类型为 Int
orm中界说为number, 假定我用orm操作数据库的时分id我传了字符串, 静态检查就会给我报错。
3、提高开发功率
orm避免了简略且重复的查询直接手写sql, 提高的开发功率。
4、缓存
比如我查网站主页一个东西,需求呢缓存1分钟, 那么orm也可以来帮我做,加个装备字段, 相同的sql就会缓存成果。
orm的缺点
ORM 在提高开发功率的一起,也带来了以下几个缺点:
- ORM 增加了大家的学习本钱,为了运用 ORM 技能,您至少需求把握一种 ORM 结构。
- 自送生成 SQL 句子会消耗核算资源,这必然会对程序性能形成一定的影响。
- 关于杂乱的数据库操作,ORM 一般难以处理,即便能处理,主动生成的 SQL 句子在性能方面也不如手写的原生 SQL。
- 生成 SQL 句子的进程是主动进行的,不能人工干预,这使得开发人员无法定制一些特别的 SQL 句子。
杂乱sql示例 像如下需求相关多个表, 各种核算的杂乱的查询,显然,orm是满意不了的, 这时分就需求手写。
static async getExtendOrderCommodity(uid, ordernos = null) {
let SQL = `
SELECT
a.orderno,
a.buy_num buyNum,
round(a.period * 365) AS period,
a.increase_capacity increaseCapacity,
b.commodityname,
b.power,
b.min_capacity minCapacity,
b.max_capacity maxCapacity,
d.start_at startAt,
DATE_ADD(d.start_at,INTERVAL a.period year) lastTime,
d.end_at endAt
FROM
order_info a
INNER JOIN commodity b ON a.commodityid = b.id
INNER JOIN order_related_sn c ON a.orderno = c.orderno
LEFT JOIN deposit d ON c.sn = d.sn
AND c.uid = d.uid
WHERE
a.uid = ?
AND b.expend_status = 1
AND c.deposit_status = 1
AND a.complete = 1
AND a.increase_capacity = 0
AND a.deleted_at IS NULL
`;
if (Array.isArray(ordernos)) {
SQL += ` AND a.orderno IN (${ordernos.join(',')})`;
}
SQL += ` GROUP BY a.orderno`;
const result = await sequelize.query(SQL, {
replacements: [uid],
type: sequelize.QueryTypes.SELECT,
logging: false,
});
return result;
}
数据库与目标之间的映射联系
数据库 | 类/目标 |
---|---|
表(table) | 类(class) |
表中的记载(record,也称行) | 目标(object) |
表中的字段(field,也称列) | 目标中的特点(attribute) |
操作数据库的三层笼统
由高到低
1、ORM
高层笼统:ORM,建立模型目标到联系型数据库的映射,之后,对模型目标的操作主动映射到数据库中
// select "name" from "users" where "id" = 9527
class User extend Sequlize {
id
}
User.findOne({
where: {
id: 9527
}
})
2、SQL query builder
中层笼统:SQL Query Builder,生成操作指令。
这一层可以理解为sql构造器,便是你把条件给好,什么表查什么字段,什么条件,它帮你拼接SQL。
可是至于有没有这张表、这个字段, 他是不会感知的,由于他没有联系映射。
例如nodejs中的 knex。
knex.select('name').from('users').where('id', '=', 9527)
//select "name" from "users" where "id" = 9527
3、原生SQL
底层笼统:Database Driver,衔接数据库并与之通讯,宣布操作指令,取回操作成果。
select "name" from "users" where "id" = 9527
操作数据库的控制力和生产力联系图
1、传统的ORM结构尽管生产力高可是可控性低
能满意大部分一般的查询,杂乱的需求手写
2、原生SQL句子尽管彻底可控可是生产力低
什么意思 自由度高,彻底自己控制,可是由于是字符串简略犯错,欠好排查问题,所以生产力低下。
3、其他SQL查询生成器高可控,中等生产力。
最终
ORM这个东西是归于言语层面的,每个言语都有自己的ORM的完成。
但ORM是一种东西,东西确实能处理一些重复,简略的劳动。这是不可否认的。但咱们不能盼望东西能一了百了的处理一切问题,有些问题还是需求特别处理的,但需求特别处理的部分对绝大多数的体系,应该是很少的, 关于大部分使用,orm都大大提高了咱们开发功率。
小伙伴们都怎么看呢?