在多租户系统中,有一个基础租户说它的tenantId = 1,其中有一组填充了租户1数据的表。每次创建新租户时,系统首先将数据从基础租户复制到新租户(正在创建的租户)中。说新租户id = 2。
租户ID = 1有像表
这样的表ROLE
id | name | tenant_id
1 | AdminRole | 1
说每个租户得到" AdminRole"开箱即用 - 以后他们可能会改变它的名字,从开箱即用的名称 - " AdminRole"到"管理员" - 角色特定于租户的原因。此角色表只是将基础租户复制到新租户时存在其他此类情况的示例。创建新租户时,角色表首先如下所示
ROLE
id | name |tenant_id
1 | AdminRole | 1
2 | AdminRole | 2
成功创建租户2后,租户2可能会更改为"管理员"
ROLE
id | name |tenant_id
1 | AdminRole | 1
2 | Administrator | 2
这不是具有静态数据的查找表。这些数据不是租户不可知的
现在还有其他表将角色称为外键。 tenant_id = 1的数据将具有正确的role_id(= 1),因为该数据已经存在。
现在对于tenant_id = 2 - 系统必须知道如何将其他表中引用角色表(作为FK)的数据链接到role_id = 2。除非我维护某种类型的Map(租户1中的role_id - >租户2中的role_id),否则我没有办法让role_id = 2用于为租户2复制的新数据。
例如当来自租户1的数据被复制并且如果正在引用role_id时,我将不得不知道对于租户2有什么新的role_id。
val roleMap = Map(1 -> 2) //1= role_id from tenant 1, 2= role_id from tenant 2
and then every time role_id is being referred while copying tenant 1 data into tenant 2 , it lookup what new role id it should put into tenant 2 data. this approach doesn't look like a best way to deal with this situation. All this is being done at an application level not DB level. What are better ways to deal with this?
P.S。在问题中没有任何Scala特定的东西,但是标记Scala的原因是为了看看是否有使用语言/其他技巧方法来处理这个问题的方法,因为解决方案是在应用程序级而不是数据库级别。
答案 0 :(得分:0)
我认为你应该把你要引用的键作为表中的额外行添加。
id | name | key | tenant_id
----+---------------+-----+-----------
1 | AdminRole | 1 | 1
2 | Administrator | 1 | 2
在Allplication中映射角色的键而不是id。 因此,对于每个租户,Admin-Role的密钥保持不变。