分库分表

Node 分库分表自动化程度较低

针对高并发、数据量大的场景,通常会考虑采用分库分表进行优化。在这篇文章,我们重点盘点一下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();

其他

SASDN-Database是基于Typeorm的封装,内部实现了分库分表的功能,对于开发者来说,只需要遵循一些规范即可像原来一样通过操作对象的方式来操作数据库。

https://github.com/agreatfool/SASDN-Database

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();