Vona ORM分表全攻略

news/2025/9/25 15:27:00/文章来源:https://www.cnblogs.com/zhennann/p/19111296

分表

针对高并发、数据量大的场景,通常会考虑采用分表机制进行优化。下面以 Model User/Order 为例,通过查询用户的订单列表,来演示分表的使用方法

分表规则

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

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

准备Models

先准备两个 Models:User/Order

  1. Model Order
@Model({entity: EntityOrder,
})
class ModelOrder{}
  1. 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: 指定 relation orders要使用的表名

到目前为止,使用默认表名查询userId=129的用户信息,使用分表查询该用户的订单列表

使用分表:Model配置

也可以直接在 Model 中配置分表规则,从而简化查询代码

  1. 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: 指定函数,实现分表规则
  1. 查询数据

现在,又可以使用常规的方式查询用户的订单列表

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/917145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对网站建设展望网站域名申请程序

一 问题的引入 约瑟夫问题的源头完全可以命名为“自杀游戏”。本着和谐友爱和追求本质的目的,可以把问题描述如下: 现有n个人围成一桌坐下,编号从1到n,从编号为1的人开始报数。报数也从1开始,报到m人离席&#xff0c…

如何在预算与风险之间做选择 iOS 混淆(源码混淆 vs IPA 混淆)的成本-收益分析与实战决策框架

本文从成本-收益和工程决策角度,提供 iOS 混淆(源码混淆 vs IPA 混淆) 的 ROI 评估模型、实战案例与 5 步决策流程,帮助团队在有限预算下科学选择混淆策略并工程化落地(含映射表、灰度与测试建议)。在现实工程里…

【兰州大学主办|EI稳定检索】第二届信息光学与光电技术国际学术会议(CIOT 2025)

第二届信息光学与光电技术国际学术会议(CIOT 2025)将于2025年10月24-26日于昆明召开。会议将围绕信息光学、光电技术等在光学领域中的最新研究成果,为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者…

深入解析:设计模式-状态模式详解

深入解析:设计模式-状态模式详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

【IEEE出版】第五届网络通信与信息安全国际学术会议(ICNCIS 2025)

2025年第五届网络通信与信息安全国际学术会议(ICNCIS2025)将于2025年10月17-19日于哈尔滨召开。【连续四届EI、Scopus双检索 | 快至会后4个月EI检索】 【已签约IEEE出版申请,已上线IEEE官方列表会议!EI检索稳定有保…

第16章 Day19 Charles安装和使用---微信小程序逆向

Charles安装(三方抓包工具) Charles客户端下载: 官网地址:https://www.charlesproxy.com/download/ 选择适合自己的系统版本下载下载安装完成后激活 激活网站地址:https://www.zzzmode.com/mytools/charles/打开安…

定制网站 北京服务器上怎么搭建网站

一,工具简介 tcpconnect工具追踪执行活动TCP连接的内核函数(例如,通过connect()系统调用;accept()是被动连接)。 详细地说,tcpconnect通过钩住内核中的tcp_v4_connect和/或tcp_v6_connect函数来工作,这些函数是在尝试建立TCP连接时被调用的。当这些函数被调用时,tcpc…

如何让百度快速收录网页如何让百度快捷收录网页的方法

如何让百度快速收录网页如何让百度快捷收录网页的方法2025-09-25 15:15 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; di…

061_尚硅谷_算术运算符课堂练习

061_尚硅谷_算术运算符课堂练习1.练习1:97天假期,有xx个星期零xx天 2.练习2:华氏温度134.2转为摄氏度

DBLINK的创建和使用(总结)

DBLINK的创建和使用(总结) 目录DBLINK的创建和使用(总结)一、什么是 DBLINK?二、创建 DBLINK 的三种主要方式方式一:使用 tnsnames.ora 文件(最常用、最推荐)步骤 1:配置 tnsnames.ora 文件步骤 2:创建 DBLI…

Could not resolve host: mirrorlist.centos.org

执行 [root@localhost yum.repos.d]# yum install bind-utils时,报centos-release-scl-rh Could not resolve host: mirrorlist.centos.org; Unknown error解决上面问题[root@localhost ~]# cd /etc/yum.repos.d [roo…

axi 4k边界检测

在AXI4协议中,一个突发传输(burst transfer)不能跨越4KB的边界,为啥呢,因为我们认为每个slave设备通常是4KB对齐的,为了避免一次burst的传输可能越过目的slave这个风险,所以就定了这个规矩 更深的说,确保数据传…

GOSIM 开源出海工作坊:给开源创业者的忠告

“出海”两个字,在开源语境里不是浪漫叙事,而是生死抉择。在这个数字机遇无限的时代,开源不仅是技术创新的象征,更是全球商业扩张的关键驱动力。本次分享将带你走过开源项目从诞生到跨越国界、进入全球市场的完整历…

华为,让金融智能体月映千江 - 指南

华为,让金融智能体月映千江 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco…

轻量级架构决策记录工具 - ADR Tools

ADR Tools是一个基于Unix shell脚本的命令行工具,用于管理和维护架构决策记录(ADRs)。它支持创建、更新和链接决策文档,采用Markdown格式存储,可与版本控制系统完美集成。ADR Tools - 架构决策记录工具 项目描述 …

一文搞懂Flex弹性布局空间分配规则

自从Flex布局面世后,基本每个项目我都是使用FLex,特别是小程序端,官方就是主推的Flex布局,相比以前你得费一些周折的布局方式,现在都能轻轻松松实现,用的多但是有一些计算细节其实也是理解不是特别深的,最近在B…

“小身材的大心脏”——HT-AD3PS-1+ 在成都恒利泰的射频江湖里到底做了什么?

“小身材的大心脏”——HT-AD3PS-1+ 在成都恒利泰的射频江湖里到底做了什么?“小身材的大心脏”——HT-AD3PS-1+ 在成都恒利泰的射频江湖里到底做了什么? 最近帮客户做一套“又要轻、又要稳、还要耐得住高低温”的射…

AT_agc012_c [AGC012C] Tautonym Puzzle 题目分析

# AT_agc012_c [AGC012C] Tautonym Puzzle## 题目描述当字符串 $ x $ 满足以下条件时,称 $ x $ 为*好字符串*。- 条件:$ x $ 可以表示为某个长度不少于 $ 1 $ 的字符串 $ y $ 重复两次所得的字符串 $ yy $。例如,`a…

电子商务网站建设pdfwordpress怎么重新安装

文章目录 一、初识TypeScript1、安装TypeScript2、Hello TypeScript 二、结合项目---配置1、tsconfig.jsontsconfig.json 重要字段compilerOptions 每个选项的详细说明 2、ts-loader 三、语法1、基本类型2、类型注解3、函数4、接口5、类6、泛型 四、结合项目---vue3结合使用 一…

详细介绍:回调函数与错误处理

详细介绍:回调函数与错误处理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…