【问题标题】:Maintain users data integrity across multiple databases for ASP.NET跨 ASP.NET 的多个数据库维护用户数据完整性
【发布时间】:2012-05-27 17:59:03
【问题描述】:

我有 2 个问题。 我正在开发一个使用标准 ASP.NET 成员资格的 ASP.NET Web 应用程序。我们打算将成员表放在 1 个数据库中。我们还有 2 个其他数据库存储 2 个不同应用程序的数据。

Shared - Membership info
DB1 - Application1
DB2 - Application2

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

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

对于 DB1 和 DB2 中的每个表,我们都会进行审计试验,即哪个用户更新了数据库中的表。因此,我们需要将 UserID 存储在 DB1 和 DB2 的表中。 我们考虑在 DB1 和 DB2 中添加一个用户表。所以每次在 Shared 中创建新用户时,DB1 和 DB2 的 Users 表中都会创建同一个用户。

我们的问题是:

  1. 考虑到上述设置,维护数据库完整性的最佳方法是什么?例如。每个员工都被分配为一个用户。如果 DB1 中的任何字段(例如用户名、姓名和电话)被更新,那么 Shared DB 中的相同字段也应该被更新,反之亦然。

  2. 在我们的案例中,是否建议将成员数据库放在不同的数据库中?由于 DB1 和 DB2 中的几乎所有表都引用共享数据库中的用户 ID,因此最好的解决方案是什么。

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?

标签: asp.net sql sql-server database


【解决方案1】:

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

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

即使您确实使用了复制服务,我仍然会将此视图设计与同步表一起使用。

您可以通过视图进行更新,但我不建议这样做。之前已经在生产中成功完成过,但是有太多的限制可能会爆炸(http://bit.ly/LJCJev)。而是直接更新保存数据的表。

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

2。 我会进行合并复制,在正确配置后,您无需担心和维护。但是,如果您需要更多手动操作,或者您不熟悉 SQL 中的复制服务,您的方法是可以的……只需使用上述视图即可。

【讨论】:

  • 非常感谢您的分享。如果我想将其扩展为一个多租户应用程序,其中“共享”数据库包含来自不同租户的所有用户。每个租户都有自己的数据库,例如Tenant1_DB1、Tenant2_DB1 等。上面提到的手动或复制会更好。在我看来,对于复制,我将无法为多租户应用程序维护共享数据库。感谢您的意见。
  • 其次,如果我们选择手动方式,我们需要在 DB1 和 DB2 中创建一个“Users”表,以便在删除或修改用户时,DB1 中的“Users”表DB2会被修改吗?
  • 所以同一个DB1以后可以称为DB1a... CREATE VIEW [dbo].[YourView] as select a.ID, a.SomeInfo, b.SomeOtherInfo from TableInA a join DatabaseB。 dbo.TableInB b
  • 复制会更好......但是如果您使用 Employee 表仅列出每个位置/数据库中的员工(其中员工表有两列:employeeID、userID),那么我可以看到视图的用途。如果您有另一个使用 USERS 表作为基础的补充表,也可以使用该视图。示例:如果您有一个 Management 表和一个 Employee 表,但它们都共享一个公共 Users 表。
  • 视图要么指向数据库中的一个表(如果你有复制服务),要么指向共享数据库上的一个表(如果你没有)。
【解决方案2】:

简单的方法:

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

【讨论】:

    猜你喜欢
    • 2011-01-01
    • 1970-01-01
    • 2017-05-27
    • 2018-06-21
    • 2021-09-21
    • 2011-06-15
    • 2010-09-24
    • 2020-02-21
    • 2017-10-19
    相关资源
    最近更新 更多