NestJS Boilerplate 项目数据库操作全指南
作为基于 NestJS 框架的现代化项目模板,NestJS Boilerplate 提供了完善的数据库集成方案。本文将全面解析该项目中的数据库操作实践,帮助开发者高效使用其数据库功能。
数据库架构概述
该项目采用六边形架构设计,同时支持两种主流数据库方案:
- 关系型数据库:PostgreSQL + TypeORM 组合
- 文档型数据库:MongoDB + Mongoose 组合
开发者可根据项目需求自由选择或组合使用这两种方案。这种设计体现了现代应用开发中"选择合适的工具解决特定问题"的理念。
TypeORM 数据库操作实践
实体与迁移管理
在 TypeORM 中,实体类代表数据库表结构。创建实体时需遵循以下规范:
// 示例:文章实体
@Entity()
export class Post extends EntityRelationalHelper {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
body: string;
}
迁移操作命令集:
| 操作 | 命令 | 说明 | |----------------|-----------------------------|------------------------| | 生成迁移文件 | npm run migration:generate
| 基于实体变化生成迁移脚本 | | 执行迁移 | npm run migration:run
| 应用所有待执行迁移 | | 回滚迁移 | npm run migration:revert
| 撤销最近一次迁移 | | 清空数据库 | npm run schema:drop
| 删除所有表(开发环境使用) |
数据填充(Seeding)技巧
数据填充是开发中的重要环节,项目提供了完整的填充方案:
-
创建填充文件:
npm run seed:create:relational -- --name Post
-
使用工厂模式生成测试数据: 结合 Faker.js 库可生成逼真的测试数据:
createRandomUser() { return { firstName: faker.person.firstName(), email: faker.internet.email(), // 其他字段... }; }
-
批量生成数据:
faker.helpers.multiple(factoryFunc, { count: 100 })
Mongoose 数据库操作实践
文档模式设计
MongoDB 采用文档模型,设计模式时需注意:
@Schema({
timestamps: true, // 自动添加 createdAt/updatedAt
toJSON: { virtuals: true } // 启用虚拟字段
})
export class PostSchemaClass extends EntityDocumentHelper {
@Prop()
title: string;
}
填充操作命令:
npm run seed:create:document -- --name Post
npm run seed:run:document
性能优化指南
PostgreSQL 优化要点
-
索引策略:
- 外键字段必须手动创建索引
- 高频查询字段应建立合适索引
-
连接池配置:
DATABASE_MAX_CONNECTIONS=100 # 根据服务器配置调整
MongoDB 优化要点
-
模式设计原则:
- 避免超大数组结构
- 合理使用嵌入文档与引用
- 考虑查询模式设计集合结构
-
读写优化:
- 适当使用投影减少数据传输
- 合理利用索引提高查询效率
数据库切换方案
项目支持从 PostgreSQL 切换到 MySQL,操作流程:
-
修改环境变量:
DATABASE_TYPE=mysql DATABASE_PORT=3306
-
更新 Docker 配置:
services: mysql: image: mysql:9.2.0
-
安装 MySQL 驱动:
npm i mysql2 --save
-
重新生成并执行迁移
最佳实践建议
-
开发阶段:
- 使用迁移管理数据库变更
- 利用种子数据加速开发迭代
-
生产环境:
- 严格审核迁移脚本
- 禁用 schema:drop 等危险命令
- 监控数据库性能指标
-
架构设计:
- 遵循六边形架构原则
- 保持数据访问层与业务逻辑解耦
- 为不同业务场景选择合适的数据库类型
通过本指南,开发者可以充分利用 NestJS Boilerplate 提供的数据库功能,构建高性能、可维护的后端服务。项目良好的架构设计使得数据库操作既规范又灵活,适合各种规模的应用开发。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考