使用新的外键ID复制数据的方法

时间:2015-10-16 22:05:17

标签: sql postgresql scala slick

在多租户系统中,有一个基础租户说它的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的原因是为了看看是否有使用语言/其他技巧方法来处理这个问题的方法,因为解决方案是在应用程序级而不是数据库级别。

1 个答案:

答案 0 :(得分:0)

我认为你应该把你要引用的键作为表中的额外行添加。

 id |     name      | key | tenant_id 
----+---------------+-----+-----------
  1 | AdminRole     |   1 |         1
  2 | Administrator |   1 |         2

在Allplication中映射角色的键而不是id。 因此,对于每个租户,Admin-Role的密钥保持不变。