一.ORM是什么?
定义 :ORM
( Object Relational Mapping) 对象关系映射,其主要作用是在编程中,把面向对象的概念跟数据库中的概念对应起来。
举例 :定义一个对象
,那就对应着一张表,这个对象的实例
,就对应着表中的一条记录
传统SQL
sql
SELECT id, first_name, last name, phone, birth_date, sex FROM persons
WHERE id = 10
res = db.execSql(sql)
name = res[O] ['FIRST_NAME']
ORM写法
typescript
p = Person.get(10)
name = p.first_name
为什么使用ORM?
当我们实现一个应用程序时(不使用O/R Mapping),我们可能会写特别多数据访问层的代码,从数据库保存、删除、读取对象信息,而这些代码都是重复的。
而使用ORM则会大大减少重复性代码。对象关系映射(Object Relational Mapping,简称ORM),主要实现程序对象到关系数据库数据的映射。
特点
- 方便维护:数据模型定义在同一个地方,利于重构
- 提高开发效率,降低开发成本
- 代码量少、对接多种库:代码逻辑更易懂
- 工具多、自动化能力强:数据库删除关联数据、事务操作等
缺点
- 自动化进行关系数据库的映射需要消耗系统性能。其实这里的性能消耗还好啦,一般来说都可以忽略之。
- 在处理多表联查、where条件复杂之类的查询时,ORM的语法会变得复杂。
二.数据库相关概念
关系型数据库,是指采用了
关系模型
来组织数据的数据库。
NoSQL
是对不同于传统的关系数据库的数据库管理系统的统称。
啥是关系模型?
关系模型本质上就是若干个存储数据的二维"表"
什么是ERD图?

数据库相关工具
- ERD设计:Navicat、 dbdesigner、QuicKDBD等在线工具
- 数据库设计参考 :open.yesapi.cn/list.html
常见数据库

关系型数据库特点
- 优点:易于维护、使用方便、支持复杂查询效率高
- 缺点:读写性能差,灵活性差
- 场景:各类业务系统、管理系统、安全性较高的场景
非关系型数据库特点
- 优点:易于扩展,大文件仔储,查询速度快
- 缺点:复杂计算与联合查询效率低
- 场景:多格式&海量数据、分布式消息系统、统计排行
三.TypeORM使用
TypeORM 无疑是
node.js
世界中最成熟的对象关系映射器(ORM
)由于它是用
TypeScript
编写的,所以它在Nest
框架下运行得非常好。
安装依赖
bash
pnpm i --save @nestjs/typeorm typeorm mysql2
封装database提供者函数,设置配置项,数据库连接
Connection
database.providers.ts
typescript
import { DataSource } from 'typeorm';
export const databaseProviders = [
{
provide: 'DATA_SOURCE',
useFactory: async () => {
const dataSource = new DataSource({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'root',
database: 'test',
entities: [
__dirname + '/../**/*.entity{.ts,.js}',
],
//同步本地的schema与数据库 -> 初始化的时候去使用
synchronize: true,
});
return dataSource.initialize();
},
},
];
在database模块中使用提供者
database.module.ts
typescript
import { Module } from '@nestjs/common';
import { databaseProviders } from './database.providers';
@Module({
providers: [...databaseProviders],
exports: [...databaseProviders],
})
export class DatabaseModule {}
存储库模式
TypeORM 支持存储库设计模式,因此每个实体都有自己的存储库。这些存储库可以从数据库连接中获取。
首先,我们需要一个实体,建立Photo
实体。
photo.entity.ts
typescript
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Photo {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 500 })
name: string;
@Column('text')
description: string;
@Column()
filename: string;
@Column('int')
views: number;
@Column()
isPublished: boolean;
}
数据库连接是 异步的 ,但 Nest
使最终用户完全看不到这个过程。PhotoRepository
正在等待数据库连接时,并且PhotoService
会被延迟,直到存储库可以使用。整个应用程序可以在每个类实例化时启动。
photo.module.ts
typescript
import { Module } from '@nestjs/common';
import { DatabaseModule } from '../database/database.module';
import { photoProviders } from './photo.providers';
import { PhotoService } from './photo.service';
@Module({
imports: [DatabaseModule],
providers: [
...photoProviders,
PhotoService,
],
})
export class PhotoModule {}
四.Prisma对比TypeORM
虽然 Prisma 和 TypeORM 解决了类似的问题,但它们的工作方式却截然不同。
TypeORM 是一种传统的 ORM,它将表 映射到模型类。这些模型类可用于生成 SQL 迁移。然后,模型类的实例在运行时为应用程序提供 CRUD 查询的接口。
Prisma是一种新型 ORM,可以缓解传统 ORM 的许多问题,例如模型实例臃肿、业务与存储逻辑混合、缺乏类型安全或由延迟加载等导致的不可预测的查询。
Prisma的优势:
- 更精简:Prisma的目标是尽可能简化开发,让开发者更专注于业务逻辑而非数据访问层。
- 更易于学习:Prisma的语法更加清晰和简单,相对TypeORM来说更容易上手。
- 强类型支持:Prisma使用TypeScript作为底层语言,提供严格类型支持,可以减少在底层和数据模型之间发生的错误。
- 更好的性能:Prisma使用批量查询和预加载等技术,可以大大提升数据库访问性能,避免了N+1查询等性能问题。
- 支持访问关系数据库、MongoDB和GraphQL数据源。
TypeORM的优势:
- 更加成熟:TypeORM在市场上已经存在较长时间,具有更广泛的用户群体和更周全的文档和社区支持。
- 支持多种数据库类型:TypeORM支持关系型数据库和一些NoSQL数据库,如MySQL、PostgreSQL、Oracle、MongoDB等。
- 丰富的特性:TypeORM提供了广泛的特性,如实体、仓储、查询构建器等,可以满足各种应用程序的需求。
- 易扩展性:TypeORM提供了广泛的插件和模块,可以扩展和自定义其功能。
- 支持在浏览器中使用:TypeORM提供了可在浏览器中使用的版本,可以用于Web应用程序和Web扩展。