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

时间:2016-12-27 05:16:22

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

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

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

每当新租户向我们注册时,我们都需要为每个租户分别设置DB。每个租户大约有15张桌子。

我们可以通过两种方式来处理这种情况

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

  2. 可以有一个包含最新架构的空数据库。因此,当租户注册时,我可以从db动态创建脚本并运行它。我不需要维护历史记录,因为空数据库模式将始终是最新的。

  3. 如果有其他方法可以告诉我。

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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