我们正在构建支持多个客户端的多租户应用程序。让我们以会计应用程序为例 - 每个组织都有自己的帐户,收据等(具有自己唯一的ID)。在我们的例子中,客户数量很少。
有两种方法可以解决这个问题
我们的应用程序创建了唯一ID(UUID),客户端负责维护自己的ID到UUID的映射。这更容易支持,但增加了客户端的复杂性(需要维护额外的UUID,并且可能必须在他们自己的微服务之间传递)
我们让客户端在API调用中指定对象的id,就像它们是唯一的租户一样,并以某种方式处理后台的唯一性。
如果我们采用第二种方法,那么我们需要将clientId与objectId结合起来。我们可以想到3种方法来做到这一点
数据库复合键。(我知道使用字符串作为pkeys的性能,)
CREATE TABLE User (
clientId String,
userId String,
PRIMARY KEY (clientId, userId)
)
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}")
}
答案 0 :(得分:0)
我在这里没有看到任何问题,但我想你想要去的路上一些建议;-) 如果您有一个多租户知道的数据库(oracle multitenant或带有分区的数据库),您可以轻松实现您的解决方案1。 我个人会使用内部guid或int代理来识别每个对象,并且只将客户端ID存储一次作为属性......