Vona ORM分表全攻略
分表
针对高并发、数据量大的场景,通常会考虑采用分表机制进行优化。下面以 Model User/Order 为例,通过查询用户的订单列表,来演示分表的使用方法
分表规则
比如需要对订单表进行分表操作。可以根据实际业务需求设计分表规则,在这里,根据用户Id取模动态生成表名。比如,拆分为16张表,用户Id为129,对应的表名如下:
const tableName = `Order_${129 % 16}`; // Order_1
准备Models
先准备两个 Models:User/Order
- Model Order
@Model({
entity: EntityOrder,
})
class ModelOrder{}
- Model User
@Model({
entity: EntityUser,
relations: {
orders: $relation.hasMany(() => ModelOrder, 'userId'),
},
})
class ModelUser {}
查询数据
1. 直接查询订单列表
class ServiceOrder {
async selectOrdersDirectly() {
const userId = 129;
const orders = await this.scope.model.order.select({
where: {
userId,
},
});
}
}
到目前为止,使用默认表名查询userId=129的订单列表
2. 基于关系查询订单列表
class ServiceOrder {
async selectOrdersByRelation() {
const userId = 129;
const userAndOrders = await this.scope.model.user.get({
id: userId,
}, {
include: {
orders: true,
},
});
}
}
到目前为止,使用默认表名查询userId=129的用户信息,使用默认表名查询该用户的订单列表
使用分表:动态方式
可以在代码中动态使用分表:
class ServiceOrder {
async selectOrdersDirectly() {
const userId = 129;
+ const tableName = `Order_${userId % 16}`;
+ const modelOrder = this.scope.model.order.newInstance(undefined, tableName as any);
const orders = await modelOrder.select({
where: {
userId,
},
});
}
}
newInstance: 传入要使用的表名,返回新的 Model 实例
到目前为止,使用分表查询userId=129的订单列表
使用分表:Relation动态选项
可以在 relation 选项中动态指定表名:
class ServiceOrder {
async selectOrdersByRelation() {
const userId = 129;
+ const tableName = `Order_${userId % 16}`;
const userAndOrders = await this.scope.model.user.get({
id: userId,
}, {
include: {
orders: {
+ meta: {
+ table: tableName as any,
+ },
},
},
});
}
}
meta.table: 指定 relationorders要使用的表名
到目前为止,使用默认表名查询userId=129的用户信息,使用分表查询该用户的订单列表
使用分表:Model配置
也可以直接在 Model 中配置分表规则,从而简化查询代码
- Model Order
@Model({
entity: EntityOrder,
+ table(_ctx: VonaContext, where: EntityOrder | undefined, defaultTable: keyof ITableRecord) {
+ const userId = where?.userId;
+ if (!userId) return defaultTable;
+ return `Order_${Number(userId) % 16}`;
+ },
})
class ModelOrder{}
table: 指定函数,实现分表规则
- 查询数据
现在,又可以使用常规的方式查询用户的订单列表
class ServiceOrder {
async selectOrdersDirectly() {
const userId = 129;
const orders = await this.scope.model.order.select({
where: {
userId,
},
});
}
}
class ServiceOrder {
async selectOrdersByRelation() {
const userId = 129;
const userAndOrders = await this.scope.model.user.get({
id: userId,
}, {
include: {
orders: true,
},
});
}
}
使用分表:App Config配置
也可以在 App config 中配置 Model options:
src/backend/config/config/config.ts
// onions
config.onions = {
model: {
'test-vona:order': {
table(_ctx: VonaContext, where: EntityOrder | undefined, defaultTable: keyof ITableRecord) {
const userId = where?.userId;
if (!userId) return defaultTable;
return `Order_${Number(userId) % 16}`;
},
},
},
};
于是,也可以使用常规的方式查询用户的订单列表
使用分表:Relation静态选项
也可以在定义 Relation 时指定静态选项:
@Model({
entity: EntityUser,
relations: {
orders: $relation.hasMany(() => ModelOrder, 'userId', {
+ meta: {
+ table(_ctx: VonaContext, where: EntityOrder | undefined, defaultTable: keyof ITableRecord) {
+ const userId = where?.userId;
+ if (!userId) return defaultTable;
+ return `Order_${Number(userId) % 16}`;
+ },
+ },
}),
},
})
class ModelUser {}
同样,也可以使用常规的方式查询用户的订单列表
Vona ORM已开源:github.com/vonajs/vona
Vona ORM分表全攻略的更多相关文章
- C#操作注册表全攻略
相信每个人对注册表并不陌生,在运行里面输入“regedit”就可以打开注册表编辑器了.这东西对Windows系统来说可是比较重要的,也是病 毒常常会光顾的地方,比如病毒和恶意软件常常会在注册表的启动项 ...
- 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法
若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...
- Moon.Orm3.8技术全攻略
Moon.ORM技术全攻略 一.绪论 本文主要是针对Moon.ORM的技术的讨论及其使用使用指导.如有其它疑问,请留言.本文主要针对Moon.ORM3.9版本,同时将会对4.0做一个技术预览.本文从 ...
- 用C#制作PDF文件全攻略
用C#制作PDF文件全攻略 目 录 前 言... 3 第一部分 iText的简单应用... 4 第一章 创建一个Document 4 第一步 创建一个Document实例:... 5 第二步 ...
- 【转】轻松搞定FTP之FlashFxp全攻略
转载网址:http://www.newhua.com/2008/0603/39163.shtml 轻松搞定FTP之FlashFxp全攻略 导读: FlashFXP是一款功能强大的FXP/FTP软件,融 ...
- 从小工到专家 ——读《Java程序员职场全攻略》有感
从小工到专家 ——读<Java程序员职场全攻略>有感 <Java程序员职场全攻略>是以故事的形式,向读者介绍Java程序员的职场经验.作者牛开复在北京从事软件开发,已经是一 ...
- 在net安装程序中部署oracle客户端全攻略
在net安装程序中部署oracle客户端全攻略 主要的是要做三件工作: 打包文件,写注册表,注册环境变量说明:我的oracle版本为9, 在2000 advanced server 上测试通过,可以正 ...
- SQL Server 备份和还原全攻略
原文:SQL Server 备份和还原全攻略 一.知识点 完全备份: 备份全部选中的文件夹,并不依赖文件的存档属性来确定备份那些文件.(在备份过程中,任何现有的标记都被清除,每个文件都被标记为已备份, ...
- MyEclipse优化全攻略
(0) 吐槽 Eclipse仅仅是个半成品有木有?什么都须要自己安装插件,新手非常难用有木有? 安装上插件以后了版本号兼容和各种问题烦死人有木有? 都怪碎片和版本号乱公布有木有? IntelliJ I ...
- QTP DataTable全攻略(1)
上一篇 / 下一篇 2009-07-27 00:14:16 / 个人分类:qtp 查看( 575 ) / 评论( 0 ) / 评分( 0 / 0 ) 下面的代码可能有点乱,基本涉及到常用的datat ...
随机推荐
- Java MCP 实战:构建跨进程与远程的工具服务
一.MCP 协议简介 MCP(Model Context Protocol,模型上下文协议)是由Anthropic推出的一种开放标准协议,旨在为大语言模型(LLM)与外部数据源.工具和服务提供标准化. ...
- 利用VBA批量删除Excel中的中文/英文/数字或者替换中英文符号
↓↓↓欢迎关注我的公众号,在这里有数据相关技术经验的优质原创文章↓↓↓ 在Excel中经常会遇到去除所有的中文,英文或者数字等情况.但是由于Excel并不支持一次替换所有的中文,英文,数字等,所以有些 ...
- IE兼容性踩坑
IE8-时间格式问题 new Date()不支持传入中划线格式的字符 跟小程序一样的bug,如下就会报错 new Date('2020-01-01') 解决办法,替换成2020/01/01的形式就好了 ...
- opengl 学习之 14
opengl 学习 之 14 lesson 简介 生成一个纹理??其实看到这里有点看不懂了.哭 link http://www.opengl-tutorial.org/uncategorized/20 ...
- java GUI 测试
简介 模拟机器人操作测试GUI code /* * @Author: your name * @Date: 2020-11-08 18:22:54 * @LastEditTime: 2020-11-0 ...
- Day5 备战CCF-CSP练习
题目描述 给定 \(n\) 个不同的整数,问这些数中有多少对整数,它们的值正好相差 \(1\). 输出格式 输入的第一行包含一个整数 \(n\),表示给定整数的个数. 第二行包含所给定的$ n$ 个整 ...
- RestCloud ETL WebService数据同步到本地
企业里面有很多业务系统只能提供WebService接口如SAP等,还有一些SaaS系统也只提供WebService的接口如Workday等,对于这些系统的数据我们可以使用ETL工具进行调用然后把XML ...
- Shell是什么?--九五小庞
Shell Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面, ...
- 服务器为什么基本上都用LINUX系统? --九五小庞
- linux下如何查看已安装的版本信息 -九五小庞
一.linux下如何查看已安装的centos版本信息: 1.Linux查看当前操作系统版本信息 cat /proc/version Linux version 2.6.32-696.el6.x86_ ...