为单点登录设计用户表以跨子域使用

sto*_*tom 8 architecture sql-server database-design database-schema

我们有一个网站,其子域名如下:

  1. example.com - 主站点
  2. food.example.com
  3. fashion.example.com

每个域和子域都有不同的数据库,如下所示:

  1. exampleDB - 带有用户表的主数据库
  2. foodDB
  3. fashionDB

你有什么尝试?

  1. 目前,对于单点登录,我们已计划在主站点中重定向用户以进行注册.

  2. 子域中的订单处理从主DB获取UserID并存储在相应的子域的Orders表中.

  3. 出于报告目的,我们将UserID不存储FK constraintOrders表中,因为我们有单独的数据库.

在这里可以看到堆栈交换站点有单独的数据库,但它是否也有单独的用户表?

StackExchange Network配置文件是否存储在单独的数据库中?

我可以从这里看到每个站点的用户表都有StackExchange网络配置文件的AccountId.

一个例子:

  1. 以下是Nick Craver Network Profile,ID:7598

  2. 他在历史记录站点中的个人资料具有相同ID的帐户ID:7598检查查询.

我无法Accounts数据愚蠢的任何地方看到表格,所以AccountId存储了吗?如何使用多个站点完成SSO AccountId

我的问题:我们是否需要主数据库中的单个用户表,或者我们必须为子域的数据库创建单独的用户表,Link Main DB UserID而不是FK约束?哪个是购物网站的最佳设计?

任何帮助都会很棒.

小智 5

您提到的 UserID 仅在单个数据库中的特定用户表中相同。它实际上不是您域中任何用户的标识符。要识别多个数据库中的用户,您需要为每个用户提供域级 ID。一种简单的方法是向全局唯一 ID(GUID,请参阅https://msdn.microsoft.com/en-us/library/system)的用户类(表)添加一个名为 UID 或类似名称的属性(列).guid(v=vs.110).aspx ) 并将其用作域级 ID 来识别用户而不是 UserId。通过这种方式,您可以自由地将用户信息存储在域中的多个数据库中。所以:

  • 您只能在每个子域的数据库中保存域级 ID,并使用该 ID 从主域数据库查询完整的用户配置文件。优点:消耗更少的内存。权衡:在分布式系统中,从子域查询用户信息需要更长的时间,因为信息驻留在主数据库中。
  • 您可以在所有数据库中保存完整的用户信息,包括主数据库和子数据库。优点:更快的查询。缺点:消耗更多内存,当用户信息发生变化时,您将不得不在所有数据库中同步它。


小智 2

1]您需要在所有三个数据库中拥有单独的用户表,因为没有外键的引用完整性。这里,如果任何数据库出现故障,那么其他域将启动并运行。权衡是,数据库管理需要更多维护,但性能不会妨碍。

或者,您可以生成以下数据库计划。

1]为所有三个域(一个主域和两个子域)保留一个数据库

2]创建一个用户表,其中有两个状态标志:food_order、fashion_order

3]分别为食品和时尚创建订单表

4] 用户订购 i) 食品或 ii) 时尚或 iii) 食品/时尚两者都有三种可能性。

5] 根据食品或时尚或食品/时尚订单保留更新状态标志。

这里的权衡是,如果您的数据库出现故障,那么您的所有三个网站都会出现故障。因此,请保持非常好的数据库灾难恢复模型。