当前位置: 首页 > news >正文

Node.js 主流ORM框架动态分表方案大盘点

针对高并发、数据量大的场景,通常会考虑采用分库分表进行优化。在这篇文章,我们重点盘点一下Node.js主流ORM框架的动态分表方案:

分表规则

比如我们需要对订单表进行分表操作。可以根据实际业务需求设计分表规则,在这里,我们根据顾客Id取模动态生成表名。比如,拆分为16张表,顾客Id为129,对应的表名如下:

const tableName = `Order_${129 % 16}`;  // Order_1

TypeORM

在TypeORM中可以按照如下方式设置动态表名:

// 获取repository
const repositoryOrder = dataSource.createQueryBuilder().connection.getRepository(EntityOrder);
// 设置动态表名
const userId = 129;
const tableName = `Order_${userId % 16}`;
repositoryOrder.metadata.tablePath = tableName;
// 查询订单
const orders = await repositoryOrder.find();

Drizzle ORM

schema.ts

const orderFactory = userId => pgTable(`Order_${userId % 16}`,{id: serial('id').primaryKey(),  name: text('name').notNull(),},
);export const order0 = orderFactory(0);
...
export const order15 = orderFactory(15);

query.ts

import * as schema from './db/schema';const db = drizzle(process.env.DATABASE_URL!, { schema });const userId = 129;
const modelName=`order${userId % 16}`;
const orders = await db.query[modelName].findMany();

Prisma ORM

Prisma ORM对动态表名的支持还在规划当中,参见:Table Partitioning

作为备选方案,我们可以使用$queryRawUnsafe直接构造原始SQL:

const userId = 129;
const tableName = `Order_${userId % 16}`;  
const orders = await prisma.$queryRawUnsafe(`SELECT * FROM "${tableName}"`);

Vona ORM

Vona ORM提供了两种模式:自动模式/手工模式

1. 自动模式

model/order.ts

import { EntityOrder } from '../entity/order.ts';@Model({entity: EntityOrder,table(ctx: VonaContext, defaultTable: keyof ITableRecord) {const user = ctx.app.bean.passport.getCurrentUser();if (!user) return defaultTable;return `${defaultTable}_${Number(user.id) % 16}`;},
})
export class ModelOrder {}
  • defaultTable: 是在EntityOrder中定义的缺省表名,如:Order

service/order.ts

class ServiceOrder {async findAll() {return await this.scope.model.order.select();}
}

2. 手工模式

service/order.ts

class ServiceOrder {async findAll() {const user = this.bean.passport.getCurrentUser();const tableName = `Order_${Number(user!.id) % 16}`;const modelOrder = this.scope.model.order.newInstance(undefined, tableName as any);return await modelOrder.select();}
}
  • newInstance: 第一个参数可以传入数据源,从而实现分库能力。这里忽略,因此传入undefined
http://www.sczhlp.com/news/34192/

相关文章:

  • 在Android中使用libpng
  • XXL-JOB v3.2.0 | 分布式任务调度平台
  • js效果网站农产品推广方案
  • 关键词网站优化平台重庆网站排名优化教程
  • win2003 做网站服务器百度手机助手app下载并安装
  • 甘南网站建设域名查询网
  • seo技术推广培训seo技术自学
  • 网站负责人核验现场拍摄照片郑州网站技术顾问
  • 六安建设厅网站国外搜索引擎
  • 武汉做网站优化多少钱免费建立网站步骤
  • 南充网站建设有哪些怎么让某个关键词排名上去
  • 企业网站icp北京关键词优化服务
  • 网站关键词优化到首页后怎么做网站网络推广企业
  • dede被挂赌博网站木马网站维护需要多长时间
  • crypto加密
  • 阿里网盘好难受
  • 外贸网站seo招聘网络营销的12种手段
  • 做网站主要步骤关键词seo排名优化如何
  • 自己做网站要学什么小程序定制开发公司
  • 有赞商城商家版百度快速排名优化服务
  • 做h网站怎么才能安全百度免费下载安装百度
  • 免费建站的手机app太原网站优化
  • 电商网站开发系列营销方案的几个要素
  • 程序_做彩票源码网站开发友情链接获取的途径有哪些
  • java电商网站建设教程青岛网页搜索排名提升
  • 2025/08/23 模拟赛总结
  • MAUI Blazor学习21-使用NLog记录安卓APP运行日志
  • VLLM进行LLM推理
  • 具有品牌的广州做网站情感营销的十大案例
  • 爱建站小程序特点河南搜索引擎优化