多租户 - 为每个租户动态创建数据库

3
我们正在做一个多租户Web应用程序,架构是单一代码库-多个数据库。
我们有一个主数据库,将存储所有租户及其对应的用户信息。
每当一个新的租户在我们这里注册时,我们需要为他们每一个都有一个单独的数据库。每个租户约有15个表。
对于此情况,我们有两个可见的选项:
1. 可以有一个SQL文件,它将作为项目的一部分,并且每当一个新租户注册时,我们可以运行脚本来创建新的数据库和表格。在这里,我需要维护所有模式修改,而且有些表是静态的。随着我们的移动,静态表数据会发生变化。因此,所有这些历史记录都必须得到维护,并且在租户注册时需要运行整个脚本。
2. 可以有一个最新架构的空数据库。因此,当租户注册时,我可以从数据库中动态创建脚本并运行它。我不需要维护历史记录,因为空数据库架构将始终是最新的。
如果还有其他方法,请告诉我。
随着功能的增长,我们还需要对现有租户表格的架构进行修改(新增列,新增表)。在考虑此情况时,我们认为第一种选择可能是最好的,因为我们将有更改查询,但在第二种选择中,我需要比较模式,这可能是繁琐的。
请分享您对如何设计它的想法。

你解决了这个问题吗?如果解决了,能否与我分享你所使用的解决方案。非常感谢。 - wandos
1个回答

2
我们做类似的事情。我们有一个共享的代码库,其中包含许多配置选项。每个租户都有自己的数据库和存储,我们将大部分租户作为单个Web应用程序运行。
我们有一个共享配置数据库来管理租户信息。我们还有一个门户,用于创建租户并管理它们,例如启用某些功能、提供存储账户、数据库等。每个租户配置都是我们配置数据库中的一行。然后我们为每个租户提供一个数据库,并生成一个租户用户并创建连接字符串,该连接字符串存储在配置数据库中。
在应用程序启动时,应用程序会识别它是哪个租户-从配置中获取要用于租户数据库的连接字符串。我们使用Entity Framework迁移迁移到最新版本,因此第一次客户端使用其数据库时会创建模式。如果我们更新模式,则添加迁移,并且下次客户端连接到数据库时将应用新模式。对我们来说工作得很好。

你在数据库操作中使用EF还是EF Core?如果是,你如何处理为新租户创建最新的数据库? - ibubi
我们使用EF 6在启动时应用迁移。我们通过在生产环境中运行自动迁移来处理它。我们对所有租户的迁移进行了自动化测试。我们考虑生成脚本或使用弹性池作业来管理它 - 但是我们有很多租户部署环,如果您接受风险,更新租户数据库的应用程序是有意义的。 - GraemeMiller
@GraemeMiller,你有共享代码库和多个数据库的Git存储库吗?如果有,并且你可以分享的话,对许多人会很有帮助。 - Kinjal Gor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接