NODEJS [DB]架构需要帮助-多租户[mysql]



我正在使用nestjs与knex和objectionjs (mysql)创建一个sass应用程序

可能的解决方案如下:

  • 使用tenantId差别器的单一数据库
  • 每个租户的架构
  • 每个租户的数据库
  • 一组租户的数据库

对于一组租户,我更喜欢使用Hybrid,即数据库。

我能够连接到多个数据库,在内存中持久化连接,并在反对模型中传递knex实例。

这些是我能想到的选项:1 -连接到所有数据库,并将连接保存在内存中,并根据每个请求更改knex连接。

2 -我在应用程序启动时不连接到db,在请求时连接到db,并为进一步的请求保持连接。

3 -我可以创建一个连接池到服务器而不指定数据库。并且在每个请求的基础上更改数据库时,为所有db使用连接。

connection: {
host : '127.0.0.1',
port : 3306,
user : 'your_database_user',
password : 'your_database_password',
}

哪个选项比较好?

另一个用例是调度作业和队列。我该怎么做?在这些情况下,我应该为每个任务创建一个knex实例吗?

引用:https://vincit.github.io/objection.js/recipes/multitenancy-using-multiple-databases.html

如果我是你,我不会选择数据库为一组租户选项,因为它有每个租户数据库单个数据库选项的缺点。

我目前也在一个多租户应用程序上工作,我选择了单个数据库,因为你能想象维护,优化和迁移例如1,000个数据库有多困难吗?(这仍然是非常少的客户。)

还有一些情况,你需要在数据库上执行任务(例如将记录移动到存档)或将其连接到Kafka以流式数据库事件,在这些情况下,如果有1000个更改将是噩梦,如果不是不可能的话。

我认为,当你的客户数量很低时,使用多个数据库是很好的,因为客户数量很低,给你带来了很好的收入,这使得所有这些问题都值得去解决。多个数据库的一些优点可能是性能,因为表的记录计数大大低于单个数据库方法。这仍然可以通过对表的tenantId或优化查询来减轻。

但是如果你不相信,我建议你使用持久提供者或LRU缓存来维护一定数量的数据库连接。

在所有表中使用tenantId列的单一数据库是可行的方法。如果您愿意,您可以稍后通过tenantId对表进行分片,如果将来有必要这样做的话。

我还建议使用字符串uuid来生成id,而不是数字。

最新更新