【问题标题】:Multi tenant - create database dynamically for each tenant多租户 - 为每个租户动态创建数据库
【发布时间】:2017-08-15 22:06:09
【问题描述】:

我们正在做一个多租户 Web 应用程序,架构是单一代码库 - 多个数据库。

我们有一个主数据库,它将存储所有租户及其相应的用户信息。

每当有新租户向我们注册时,我们都需要为每个租户提供单独的数据库。每个租户大约有 15 张桌子。

我们可以看到两个选项来处理这种情况

  1. 可以有一个 sql 文件作为项目的一部分,每当有新租户注册时,我们可以运行脚本来创建新的数据库和表。在这里,我需要维护所有架构修改,并且静态表很少。随着我们继续,静态表数据将被修改。所以所有这些历史都必须维护,我们需要在租户注册时运行整个脚本。

  2. 可能存在具有最新架构的空数据库。因此,当租户注册时,我可以从数据库动态创建脚本并运行它。我不需要维护历史记录,因为空的数据库架构总是最新的。

如果有其他方法,请告诉我。

随着功能的增长,我们还需要修改现有租户表的架构(新列、新表)。在考虑这种情况时,我们认为第一个选项可能是最好的,因为我们将有更改查询,但在第二个选项中,我需要比较可能很乏味的架构。

请分享您对如何设计它的想法。

【问题讨论】:

  • 您解决了这个问题吗?如果您这样做了,请与我分享您使用的解决方案。非常感谢

标签: c# sql-server database entity-framework multi-tenant


【解决方案1】:

我们做类似的事情。我们有一个包含许多配置选项的共享代码库。每个租户都有自己的数据库和存储,我们将其中大部分作为单个 Web 应用程序运行。

我们有一个管理租户信息的共享配置数据库。我们还有一个门户网站可以创建租户并对其进行管理,例如启用某些功能、配置存储帐户、数据库等。每个租户配置都是我们配置数据库中的一个数据库行。然后我们为每个租户配置一个数据库并生成一个租户用户并创建一个存储在配置数据库中的连接字符串。

在应用程序启动时,应用程序识别它是哪个租户 - 从配置中获取用于租户数据库的连接字符串。我们正在使用实体框架迁移迁移到最新版本,因此客户端第一次使用他们的数据库时,就会创建架构。如果我们更新架构,则会添加迁移,并且下次客户端连接到数据库时会应用新架构。对我们来说很好。

【讨论】:

  • 您使用 ef 还是 ef core 进行数据库操作?如果是,您如何处理为新租户创建数据库(最新)?
  • 我们使用 EF 6 在启动时在代码中应用迁移。我们通过在生产中运行自动迁移来处理它。我们对租户的所有迁移进行了自动化测试。我们研究了生成脚本或使用弹性池作业来管理它 - 但我们有很多租户部署环,并且应用程序更新租户数据库是有意义的(如果您接受风险)
  • @GraemeMiller 你有共享代码库和多个数据库的 git 存储库吗,如果有,你可以分享它对很多人都有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 2017-09-16
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多