多租户应用程序中唯一的客户端提供的ID

时间:2018-02-10 16:18:08

标签: sql rest domain-driven-design multi-tenant

我们正在构建支持多个客户端的多租户应用程序。让我们以会计应用程序为例 - 每个组织都有自己的帐户,收据等(具有自己唯一的ID)。在我们的例子中,客户数量很少。

有两种方法可以解决这个问题

  1. 我们的应用程序创建了唯一ID(UUID),客户端负责维护自己的ID到UUID的映射。这更容易支持,但增加了客户端的复杂性(需要维护额外的UUID,并且可能必须在他们自己的微服务之间传递)

  2. 我们让客户端在API调用中指定对象的id,就像它们是唯一的租户一样,并以某种方式处理后台的唯一性。

  3. 如果我们采用第二种方法,那么我们需要将clientId与objectId结合起来。我们可以想到3种方法来做到这一点

    1. 每个客户端的数据库表。我们根据client_id决定使用哪个表。需要手动或自动为每个客户端创建一整套表。
    2. 数据库复合键。(我知道使用字符串作为pkeys的性能,)

      CREATE TABLE User ( clientId String, userId String, PRIMARY KEY (clientId, userId) )

      1. 应用程序级别:应用程序维护两者,并负责返回客户端的id,同时生成供内部使用的内部UUID。内部标识可以针对存储类型进行优化。例如(Scala)
      2. trait UniqueId[T]{ val toClientId: String // The unique id we got from a client val to InteralId: T // The unique id we use internally } case class Id(client: Client, userId: String) extends UniqueId[...]{ val toClientId = userId // Could have any of... val to InteralId = s"${client.name}_${userId}" val to InteralId = MD5(s"${client.name}_${userId}") }

1 个答案:

答案 0 :(得分:0)

我在这里没有看到任何问题,但我想你想要去的路上一些建议;-)   如果您有一个多租户知道的数据库(oracle multitenant或带有分区的数据库),您可以轻松实现您的解决方案1。   我个人会使用内部guid或int代理来识别每个对象,并且只将客户端ID存储一次作为属性......