将单客户端 SQL Server 数据库转换为单数据库多租户

Mat*_*att 5 database sql-server federated-identity multi-tenant federation

我们目前有一个系统,每个用户都可以获得一个数据库。我们现在正在转向单数据库多租户模式,以便一个数据库可以容纳许多客户。

几个问题:

  1. 是否存在多租户转换工具?Tenant或者这只是创建一个表并将其添加TenantID到每个其他表的过程?

  2. 有没有一种简单的方法可以实现多租户而无需重构与数据库通信的代码?

    我们有一个Odata.svc与数据库进行所有通信的程序(我们的前端客户端范围从 .net 前端到 iOS 设备)。我读了一些有关使用联合对tenantID谓词执行过滤的内容,因此根本不需要更改代码。这可能吗?

  3. 对于数据库中的租户数量是否有建议的限制?

我认为这是一个愚蠢的问题(一根绳子有多长)。我们很可能会在 Azure 上托管最终解决方案。

期待任何人能给我的任何建议。我们正在对我们的流程进行根本性的改变,所以我想在我们陷入困境之前先占上风。

Gru*_*ber 3

自动化?

从理论上讲,应该可以制作一个工具,使执行这项艰巨的操作(从单租户到多租户)变得更加容易。然而,鉴于此类产品的受众有限,我认为这样的工具不存在。如果有人出现的话那就太好了。

关于手动转换的想法

首先设计一个新的多租户数据库架构。(这意味着将所有单租户数据库模式与您可能拥有的任何共享模式合并。)我想让它像在设计时没有考虑遗留问题一样。

显然,您需要一个Tenant表,许多现有的单租户表需要使用该Tenant_id表来引用该表。例如,包含用户的表需要将用户与租户唯一关联。

对于简单Products表(作为Product_id主键),应该可以添加一列,从而生成具有组合键(和)Tenant_id的表。但是,如果您从头开始编写应用程序,我相信没有租户引用的表是正确的方法。这也让租户可以共享产品,而不是添加重复的产品。由于一个租户可能拥有包含1,2,3 和另一个 1,2 的产品,因此您不能简单地合并表,因为您不能两次使用相同的 ID — 您需要唯一的主键值。解决此问题的一种方法是编写一个程序(使用 Java 或其他高级语言),将租户数据库中的所有数据读取到内存对象中,然后将数据写入多租户模式。对于下一个租户数据库重复该过程,依此类推。这样你就会得到值 1,2,3,4,5。一种快速而肮脏的方法是向每个模式中的所有 ID 值添加一个数字,例如 1,000、2,000 等,然后祈祷不会发生冲突。Tenant_idProduct_idProductProduct_idProduct_id

与数据库通信的代码

您将需要重写大多数数据库查询,以考虑数据库现在是多租户的事实。这是一项艰巨的任务,特别是考虑到引入一个让一个租户篡改另一个租户数据的错误所带来的影响。然而,一些技术可以使这项任务变得更容易。例如,租户视图过滤器可以大大减少所需的工作量。

租户数量限制

我从未见过限制多租户结构中租户数量的建议。相反,多租户方法的优势在于其可扩展性。如今,您可以轻松创建数据库服务器集群,或使用基于云的解决方案根据需要无缝添加更多硬件功能。

感兴趣的链接