为什么需要企业级结构?
当项目从个人开发走向团队协作时,如果没有统一架构,Prisma 代码会迅速变成“散落在各处的数据库调用”,难以维护、难以扩展。
问题场景
Controller 直接查库
逻辑混乱无法复用
重复 Prisma 查询
代码冗余严重
事务散落
无法统一控制一致性
难以测试
业务逻辑无法单测
标准三层架构
架构分层
Controller
HTTP 请求层
Service
业务逻辑层
Repository
数据库访问层(Prisma)
Prisma Module 封装
prisma.service.ts
typescript
import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {
async onModuleInit() {
await this.$connect();
}
async onModuleDestroy() {
await this.$disconnect();
}
}Repository 层设计
user.repository.ts
typescript
import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
@Injectable()
export class UserRepository {
constructor(private prisma: PrismaService) {}
findById(id: number) {
return this.prisma.user.findUnique({
where: { id }
});
}
findByEmail(email: string) {
return this.prisma.user.findUnique({
where: { email }
});
}
create(data: { name: string; email: string }) {
return this.prisma.user.create({ data });
}
}Service 层(业务核心)
user.service.ts
typescript
import { Injectable } from '@nestjs/common';
import { UserRepository } from './user.repository';
@Injectable()
export class UserService {
constructor(private repo: UserRepository) {}
async register(data: { name: string; email: string }) {
const exists = await this.repo.findByEmail(data.email);
if (exists) throw new Error('User already exists');
return this.repo.create(data);
}
}Controller 层
user.controller.ts
typescript
import { Controller, Post, Body } from '@nestjs/common';
import { UserService } from './user.service';
@Controller('user')
export class UserController {
constructor(private service: UserService) {}
@Post('register')
register(@Body() body: { name: string; email: string }) {
return this.service.register(body);
}
}事务标准写法
transaction.ts
typescript
import { PrismaService } from '../prisma/prisma.service';
async function createUserWithPost(prisma: PrismaService) {
return prisma.$transaction(async (tx) => {
const user = await tx.user.create({
data: { name: 'A', email: 'a@test.com' }
});
await tx.post.create({
data: {
title: 'Hello',
userId: user.id
}
});
return user;
});
}项目目录结构
structure.txt
text
src/
modules/
user/
user.controller.ts
user.service.ts
user.repository.ts
post/
post.controller.ts
post.service.ts
post.repository.ts
prisma/
prisma.service.ts
common/
dto/
utils/
guards/
main.ts核心规范
必须遵守
Controller 不写业务
只负责请求转发
Service 控制事务
业务逻辑核心
Repository 封装 Prisma
禁止直接调用 Prisma
DTO 统一输入输出
保证接口稳定性
总结
这一套结构可以支撑从中小型系统到高并发后端服务,是 Prisma 在企业级项目中的标准落地方式。
下一步升级
终极阶段
多租户架构设计
SaaS 系统核心能力
读写分离 + 分库分表
高并发数据库架构
相关笔记
在数字化一期,此笔记未产生更深相关的共鸣分枝。