什么是ORM?

ORM结构:Object Relational Mapping,目标-联系-映射,所以说ORM结构便是用面向目标的方式和现在的联系型数据库做匹配。

为什么会有ORM?

它处理了目标和联系型数据库之间的数据交互问题。

数据库ORM及操作数据库的三层抽象概述(Node.js为例)

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)

数据库ORM及操作数据库的三层抽象概述(Node.js为例)

操作数据库的三层笼统

由高到低

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及操作数据库的三层抽象概述(Node.js为例)

最终

ORM这个东西是归于言语层面的,每个言语都有自己的ORM的完成。

但ORM是一种东西,东西确实能处理一些重复,简略的劳动。这是不可否认的。但咱们不能盼望东西能一了百了的处理一切问题,有些问题还是需求特别处理的,但需求特别处理的部分对绝大多数的体系,应该是很少的, 关于大部分使用,orm都大大提高了咱们开发功率。

小伙伴们都怎么看呢?