共计 2978 个字符,预计需要花费 8 分钟才能阅读完成。
写作不易,未经作者容许禁止以任何模式转载!
如果感觉文章不错,欢送关注、点赞和分享!
继续分享技术博文,关注微信公众号 👉🏻 前端 LeBron
原文链接
什么是 ORM
对象关系映射(Object Relational Mapping,简称 ORM),是一种程序技术,实现面向对象编程语言中的内存对象与关系型数据库中的业务实体之间的关系映射。这样在咱们操作数据库的时候,不再须要和简单的 SQL 语句打交道,只须要简略地操作对象的属性和办法就能够间接实现对数据库中对应实体表的 CRUD(增删改查)的操作。常见的 ORM 框架有 Node.js 的 TypeOrm、Sequlize,Java 的 Hibernate、Mybatis 和 Go 的 Gorm、GoRose 等。
-
ORM 的方法论基于三个外围准则
- 简略:以最根本的模式建模数据
- 传播性:数据库构造被任何人都能了解的语言文档化
- 精确性:基于数据模型创立正确、标准化的构造
为什么会呈现 ORM
面向对象编程语言和关系型数据库都是目前最风行的技术,但他们的模型是不一样的。
- 简直所有的程序外面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,咱们是面向对象的。当对象信息发生变化的时候,咱们须要把对象的信息保留在关系数据库中。
- 以 MVC 分层模式为例。Model 作为数据承载实体,在用户界面和业务逻辑层之间,数据以面向对象的模式传递;而当咱们须要通过 Controller 散发申请把数据长久化的时候,咱们就遇到了内存中的对象如何长久化成关系数据库中存储的一条理论数据记录的问题。
- 面向对象是从软件工程的根本准则,即封装,继承,多态的根底上倒退起来的;而关系型数据库则是从数学实践的根底上倒退起来的,两者之间是不匹配的。所有就呈现了 ORM 以我的项目中间件的模式实现数据在不同场景下的数据关系映射。。而对象关系映射就是这样一种为了解决面向对象与关系数据库存在的互不匹配的景象的技术。在其根底上诞生很多对象和关系之间的映射框架,也即 ORM 技术。
ORM 的应用 以 Sequelize 为例
仅示例,更多操作可参考
- Sequelize 中文文档
- RobinBuschmann/sequelize-typescript
Sequelize 是一个基于 Promise 的 Node.js ORM, 目前反对 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server. 它具备弱小的事务反对, 关联关系, 预读和提早加载, 读取复制等性能。
Sequelize 听从 语义版本控制。反对 Node v10 及更高版本以便应用 ES6 性能。
连贯数据库
- 设置应用 sequlize 插件,并配置要连贯的数据库
定义 Model
通过面向对象 Class 和 关系型数据库的表建设连贯
@Column 示意数据库的一列
@PrimaryKey 示意主键
import {
Column,
Model,
PrimaryKey,
Table,
} from '@gulu/sequelize/typescript';
enum GameType {
micro_game = 'micro_game',
mobile_game = 'mobile_game',
micro_app = 'micro_app',
}
@Table({modelName: 'game', timestamps: false})
export default class GameModel extends Model {
@PrimaryKey
@Column
gameId!: string;
@Column
name!: string;
@Column
description?: string;
@Column
type!: GameType;
@Column
icon?: string;
@Column
isDelete!: number;
}
操作数据库
通过 Model 的办法操作数据库
import GameModel from '../model/game';
// 游戏列表查问服务
async query() {
return GameModel.findAll({
// 去除软删除字段
attributes: {exclude: ['isDelete'],
},
// 查问未被软删除的游戏
where: {isDelete: 0,},
});
}
相当于以下 SQL 语句
select gameId, name, description, type, icon from game where isDelete = 0;
当然 Sequlize 也反对 SQL 语句查问
import GameModel from '../model/game';
// 游戏列表查问服务
async query() {
return GameModel.sequelize.query('select gameId, name, description, type, icon from game where isDelete = 0',);
}
ORM 的优缺点
长处
- 暗藏了数据拜访的细节,“关闭”的通用数据库交互是 ORM 的外围。他使得咱们的通用数据库交互变得简单易行,并且齐全不必思考 SQL 语句。
- 开发效率更高,ORM 使咱们结构固化数据变得简单易行,在 ORM 诞生前,咱们须要见过咱们的对象模型转化为一条一条的 SQL 语句,通过直连或者是 DB helper 在关系数据库结构咱们的数据库体系。而当初,基本上所有的 ORM 框架都提供了通过对象模型结构关系数据库构造的性能。
- 数据拜访更形象、轻便,反对面向对象封装。数据模型都在一个中央定义,更容易更新和保护,也利于重用代码
- ORM 有现成的工具,很多性能都能够主动实现,比方数据消毒、预处理、事务等等。
- 它迫使你应用 MVC 架构,ORM 就是人造的 Model,最终使代码更清晰。
- 基于 ORM 的业务代码比较简单,代码量少,语义性好,容易了解。
- 防备 SQL 注入攻打
- 不用编写性能不佳的 SQL。
毛病
- 无可避免的,自动化意味着映射和关联治理,代价是就义性能。当初的各种 ORM 框架都在尝试应用各种办法来加重性能上的损失,如懒加载技术、缓存技术等。
- 面向对象的查询语言作为一种数据库与对象之间的过渡,尽管暗藏了数据层面的业务形象,但并不能齐全屏蔽数据库层的设计。ORM 库也不是轻量级的工具,须要花很多精力学习和设置,无疑将减少学习老本。
- ORM 难以实现过于简单的查问。尽管能够实现,然而须要破费很大的代价(性能不如原生 SQL)。
- 长久化层不足弹性,一旦呈现业务需要变更,就必须批改长久化层的接口
- 长久化层同时与域模型与关系数据库模型绑定,不论域模型还是关系数据库模型发生变化,都要批改长久化层相干程序代码,减少了软件的保护难度。
什么是“长久化”层
- 长久(Persistence),即把数据(如内存中的对象)保留到可永恒保留的存储设备中(如磁盘)。长久化的次要利用是将内存中的数据存储在关系型的数据库中,当然也能够存储在磁盘文件中、XML 数据文件中等等。
- 总结:当下 ORM 的开发模式是支流,进步了代码的封装性和可读性,同时防备了 SQL 注入攻打。以较小量级的性能损失换来了显著的开发效率晋升,显著的性能损失往往存在于简单的查问,这种状况能够抉择应用 ORM 提供的 SQL 语句接口进行查问以优化性能。
- 原文链接
- 掘金:前端 LeBron
- 知乎:前端 LeBron
- 继续分享技术博文,关注微信公众号 👉🏻 前端 LeBron