对用户进行分区 - 多个OpenID

时间:2010-09-23 14:10:32

标签: sql database openid azure partitioning

有用户数据库 假设我想支持一些用户可以拥有多个OpenID并使用它们登录,让我们说我想将用户分配到多个数据库。

有什么解决方案吗? StackOverflow支持每个用户两个OpenID,他们将如何做到这一点?

如果用户只能使用一个OpenID,则可以有多种分区选择。对于多个OpenID,我有两个表与1-n关系。

在这种情况下是否有一些算法可以进行有效的分区?

更新 正如Noon Silk所提到的,问题不是OpenID特有的。我只对分区感兴趣,我提到OpenID,因为在这种情况下创建映射函数可能是相关的。

尝试将其作为一般问题。
我有两个表A和B,关系n为1.在这种情况下,是否有一些规则/建议如何进行分区,以便完整信息在一个数据库中?

如果
A1与B1
有关 A2与B1
有关 A3与B1有关

A4与B2有关 A5与B2相关

如何将A1-A3和B1放在一个数据库中,将A4-A5和B2放在另一个数据库中?

3 个答案:

答案 0 :(得分:1)

如果你把它放在Azure表(AZT)中,我实际上会使用两个表。由于您要在OpenId登录时想要查找用户,我会有一个UserOpenId表,其中分区键是整个OpenId,行键为空或其他常量,并且它具有您的实际用户ID在另一个领域。然后将用户ID作为主用户表中的分区键(同样使用行键的常量)。这将为您提供查找该用户的最快方式。确保在查询中包含PartitionKey和RowKey。

使用AZT,您无需担心分区大小均匀,您只需要担心如何从中获取数据。如果您一次只能获得一个特定项目,请将分区键设为您要查找的项目。如果您要将组中的项目分组,请使用分区键,您将查找它,行键是唯一ID。

答案 1 :(得分:0)

OpenID实际上只是用户的唯一ID。因此,显然,您可以根据“用户”关联多个这样的用户。

因此,如果您希望将系统中的用户与OpenID链接起来的多个(由于某种原因n增加)方法,显然链接表是有意义的(即tblUser - > tblUserOpenIDs,或类似的方法)。

答案 2 :(得分:0)

“如何将A1-A3和B1放在一个数据库中,将A4-A5和B2放在另一个数据库中?”

在现实生活中实现这项工作的一种方法是放弃自动参照完整性检查,并将两个表视为两个完全独立的实体。这样你可以像Noon Silk建议的那样进行分区。两者都不需要在同一个数据库中(虽然它会很好),特别是因为两个表都是不可变的。