2010-09-23 52 views
0

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

有没有解决方案? StackOverflow支持每个用户使用两个OpenID,他们将如何执行此操作?

如果用户只能使用一个OpenID,则会有多种分区选择。在多个OpenID中,我有两个具有1-n关系的表。

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

更新 正如中午丝绸提到的,问题不是特定于OpenID。我只是对分区感兴趣,我提到了OpenID,因为在这种情况下,它可能与创建映射函数有关。

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

如果
A1是关系到B1
A2是关系到B1
A3是关系到B1

A4是与B2
A5是关系到B2

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

回答

0

OpenID实际上只是用户的唯一ID。所以,很明显,您可以将每个“用户”中的多个关联起来。因此,如果你想让系统中的用户与一个OpenID有多个连接表(比如n增加),显然链接表是有意义的(即tblUser - > tblUserOpenIDs或类似的方法)。

+0

主要问题是分区。如果我开始按照OpenID的第一个字母进行分割,它们可以位于不同的数据库中。我会在哪个数据库中放置用户信息? – 2010-09-23 14:22:02

+0

因此,重新构思您的问题并删除所有对OpenID的引用,您会发现问题很普遍。你想分割一些东西?找到一种算法,将数据均匀分布在一定范围内,并通过x%numServ分配服务器。 – 2010-09-23 14:32:28

1

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

使用AZT,您无需担心分区大小均匀,您只需要担心如何从中获取数据。如果您只是一次只能拿出一件特定物品,请将分区键设为您要查找的物品。如果您要将这些项目分组出来,请使用分区键,您将要查看的项目以及行键是唯一的ID。

0

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

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