我们正在做一个 Multi-Tenancy Web 应用程序,架构是单一代码库 - 多数据库。
我们有一个主数据库,将存储所有租户及其对应的用户信息。
每当有新租户向我们注册时,我们都需要为他们每个人提供单独的数据库。每个租户大约有 15 张 table 。
我们有两个选项可以处理这种情况
可以有一个 sql 文件,它将成为项目的一部分,每当新租户注册时,我们都可以运行脚本来创建新的数据库和表。这里我需要维护所有的模式修改,并且有几个静态表。随着我们的前进,静态表数据将被修改。所以所有这些历史都必须维护,我们需要在租户注册时运行整个脚本。
可以有一个包含最新架构的空数据库。因此,当租户注册时,我可以从数据库动态创建脚本并运行它。我不需要维护历史记录,因为空数据库架构将始终是最新的。
请告诉我是否有任何其他方法可以做到这一点。
随着功能的增长,我们还需要修改现有租户表的架构(新列,新表)。在考虑这种情况时,我们认为第一个选项可能是最好的,因为我们将进行更改查询,但在第二个选项中,我需要比较模式,这可能很乏味。
请分享您对如何设计它的想法。
最佳答案
我们做类似的事情。我们有一个包含许多配置选项的共享代码库。每个租户都有自己的数据库和存储,我们将其中大部分作为单个 Web 应用程序运行。
我们有一个管理租户信息的共享配置数据库。我们还有一个门户网站可以创建租户并管理它们,例如启用某些功能、配置存储帐户、数据库等。每个租户配置都是我们配置数据库中的一个数据库行。然后我们为每个租户提供一个数据库并生成一个租户用户并创建一个存储在配置数据库中的连接字符串。
在应用程序启动时,应用程序会识别它是哪个租户 - 从配置中获取用于租户数据库的连接字符串。我们正在使用 Entity Framework 迁移迁移到最新版本,因此客户端第一次使用他们的数据库时会创建模式。如果我们更新架构,则会添加迁移,并且下次客户端连接到数据库时会应用新架构。对我们来说效果很好。
关于c# - Multi-Tenancy - 为每个租户动态创建数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41339371/