2012-05-27 41 views
1

我有2个问题。 我正在开发一个使用标准ASP.NET成员身份的ASP.NET Web应用程序。我们打算在1个数据库中拥有会员表。我们有2个其他数据库存储2个不同应用程序的数据。维护用户对ASP.NET的多个数据库的数据完整性

Shared - Membership info 
DB1 - Application1 
DB2 - Application2 

这两个应用程序都使用“共享”数据库中的成员信息。 共享数据库有一个名为userdetals的表,用于存储其他用户的信息,例如姓名,电话和职位。

但是,DB1还有一个名为employees的表,其中存储了与姓名,电话和职位相同的字段。每个员工可能是一个用户。

同样对于DB1和DB2中的每个表,我们都会保留审计试验,即哪个用户更新了数据库中的表。因此,我们需要将用户ID存储在DB1和DB2的表中。 我们认为在DB1和DB2中添加了一个Users表。因此,每当在Shared中创建新用户时,将在DB1和DB2的Users表中创建相同的用户。

我们的问题是:

  1. 什么是给上面的设置,以保持数据库完整性的最佳方式是什么?例如。每个员工都被分配为一个用户。如果DB1中的任何字段(如用户名,姓名和电话)已更新,则共享DB中的相同字段应更新,反之亦然。

  2. 在我们的案例中建议在不同的数据库中拥有会员资格数据库吗?什么是最好的解决方案,因为几乎DB1和DB2中的所有表都引用Shared数据库中的userID。

+1

您使用的是哪个版本的SQL Server? – Oded

回答

2

1. 你正在寻找的技术是合并复制(http://bit.ly/KUtkPl)。实质上,您可以在两个数据库上创建一个通用Users表,在一个应用程序数据库上创建合并复制发行商,然后在另一个应用程序数据库上创建合并复制订户。您也可以将其设置为同步模式(这也意味着您只需要在发布数据库上创建一次表格:它会将包含数据的表格,架构推送给订阅者)。

但是,如果您正在寻找更多手动方法,我不会将用户数据非规范化到员工表,而是在每个应用程序服务器上创建补充表和视图。 OOP中的类似继承:Employee表和Users表之间的任何公共数据都保留在共享用户表上。 Employee的任何唯一列,仅添加到补充表中并存储在每个数据库中。该视图将合并补充表和共享表。 (http://bit.ly/9KPxt0

即使您使用复制服务,我仍然会使用此视图设计和同步表。

你可以通过视图更新,但我不会建议。它已经在生产成功之前完成,但是有太多限制可能会炸毁(http://bit.ly/LJCJev)。而是直接更新包含数据的表。

绝对避免“触发器同步”。风险太大(可能导致SQL服务器上的婴儿循环)以及过多的维护开销。

2. 我会做合并复制,它只是更少担心和维护后,它配置正确。但是,如果您想要更加手动的操作,或者您不熟悉SQL中的复制服务,那么您的方法就可以了......只需使用上面提到的视图即可设置。

+0

我真的很感谢你的分享。如果我想将其扩展到多租户应用程序,即“共享”数据库包含来自各个租户的所有用户。每个租户都有自己的数据库,例如Tenant1_DB1,Tenant2_DB1等。如上所述,手动工作会更好或复制。在我看来,对于复制,我无法为多租户应用程序维护共享数据库。感谢您的投入。 – CAS

+0

其次,如果我们选择手动方法,我们还需要在DB1和DB2中创建一个“用户”表,并且如果用户被删除或修改,DB1和DB2中的“用户”表将被修改? – CAS

+0

因此同样DB1可以被称为DB1a在未来... CREATE VIEW [DBO]。[YourView] 作为 从TableInA选择 a.ID, a.SomeInfo, b.SomeOtherInfo 一个 加入DatabaseB。 dbo.TableInB b – CAS

0

简单的方法:

您可以创建这些数据库的链接服务器。 然后创建易于访问每个数据库表的同义词。 创建触发器以在每个表上更新任何数据时更新数据。