omi*_*idh 6 architecture database-design node.js typeorm nestjs
我使用NestJs和 Nodejs制作了一个 CRM 应用程序。我以每个团队都有自己的数据库的方式设计它,因为每个团队的数据都是不同的,并且与其他团队没有关系,而且它使备份过程变得更加容易。
但是,现在我想部署我的服务,我注意到对于每个团队,我必须创建一个单独的 nodejs 实例,这使得 ram 使用率非常高。想象一下,对于 10 个团队,我可能需要大约 500MB 的内存,即使在短期内,这也会在经济上伤害我。
解决方案
我在 NestJs 中使用了 TypeORM,所以我的第一个想法是找到一种方法让多个数据库(不是多个连接)共享相同的模式,但根据请求的范围和细节动态使用其中一个。这似乎是最好的解决方案,因此我可以避免创建另一个 NodeJs 实例,同时我现在为每个团队拥有单独的数据库。
我阅读了 nestJs 和 TypeORM 文档,但没有找到任何方法来实现它。所以我的另一个解决方案是只为everone 使用一个数据库,并team_id在每个表中添加类似列的内容,以便为每个团队制作过滤数据。
这是一个好方法吗?
是否有其他解决方案可以使用一个 nestJs 实例但对多个数据库使用相同的架构?
我建议使用一个数据库。
数据库可以有一个表保存所有团队,其他表将有一个新team_id列,如您所想。
每个团队一个数据库有缺点。
由于您需要Entities为团队的所有数据库使用相同的数据库,因此您不能使用Single Database Connection. 根据每个传入的 API 请求,服务器必须切换数据库连接。
对于多个数据库,配置将如下所示:
imports: [
...,
TypeOrmModule.forRoot({
name
type
host
port
username
password
...
}),
TypeOrmModule.forRoot({
name
type
host
port
username
password
}),
...
]
Run Code Online (Sandbox Code Playgroud)
如果您需要添加一个新团队,则必须更新代码库以便为团队添加新数据库,并且必须重新部署您的应用程序。(也许您将创建一个新数据库并执行迁移?)
我同意你的观点,最好用多个数据库备份一个团队。但是当你想备份所有团队时呢?在大多数情况下,我认为它需要备份所有团队,而不仅仅是特定团队。
你在哪里保存团队的信息?怎么知道哪个队有什么db?也许你保存在teams某个地方(在一个单独的数据库中?)。要知道每个请求应该使用哪个数据库连接,它需要进行新的查询吗?
如果有 100 个团队,你会制作 100 个数据库吗?每个应用程序也有development和production环境。在某些情况下,可以有更多环境,例如staging. 2 envs 将使dbs 的数量增加一倍。
结论
当然,会有一种方法可以自动化上面列表中的某些项目,并且仍然可以在 NestJS + TypeORM 中为您的项目使用 multipe 数据库,但它看起来不是一个好方法,也不值得为您的项目付出努力。
我见过一些大型的多租户应用程序(如grafana),但它们没有使用multiple databases策略。
我不知道你如何存储用户,但既然你谈论的是团队,我想你有一个存储用户并将其分配给团队的地方,它可能是登录公共数据库中的一个表吗?
解决方案可能是将每个团队绑定到自己的数据库;一旦用户登录(从公共登录数据库访问数据),您读取其所属的团队及其数据的数据库,然后您可以从与用户所属团队绑定的数据库访问CRM数据。
| 归档时间: |
|
| 查看次数: |
302 次 |
| 最近记录: |