我在一个监管/法律原因下的环境中工作,我们必须将每个客户的数据保存在单独的数据库中。然而,有些信息必须共享,主要是与查找表相关的内容,用于确定哪个客户的URL对应哪个数据库。此外,客户可以选择拥有多个数据库,以便以某种逻辑方式分离其数据。因此,对于我们的每个产品,我们实际上有三种类型的数据库:
1. ApplicationData,它只有几个包含有关客户本身的信息的表,例如当通过特定URL访问时使用哪个MasterData数据库(见下文)以及哪些功能对该客户可用。每个产品只有一个ApplicationData,无论有多少不同的客户在使用该产品。
2. MasterData,其中包含特定于客户的信息,例如用户、角色和权限(在我们的情况下,aspnet_regsql创建的表在此处)。这里指定的权限包括哪些ClientData数据库对给定用户可用(见下文)。所有MasterData数据库(对于同一产品)的模式都相同。
3. ClientData,其中包含用户交互的数据。在一个产品中,这是客户可以根据大量标准搜索、创建报告等的数据。在另一个产品中,这包含了客户可以上传的动态数据,以便其他用户可以通过电话联系人进行调查等。对于同一产品的所有ClientData数据库,模式都相同。
现在,有一个警告:实际上,我们对MasterData和ClientData使用相同的模式,通常也使用同一个实际数据库。这是由于历史原因,因为允许客户拥有一个认证数据库(MasterData),对应多个ClientData数据库的能力是一个相对较新的功能,仅适用于我们的一个产品。此外,由于大多数客户只使用一个ClientData数据库,这种结构简化了部署。但是,在我们的项目中,MasterData和ClientData具有不同的实体模型下Entity Framework,并且我们必须确保MasterData和ClientData之间没有直接关系,例如外键。
这个设置对我们来说非常有效。一个主要优点是,在不同的服务器上放置不同的ClientData数据库没有问题。这对于负载平衡非常有帮助,并提供了一种自然的数据分区方式。如果客户愿意支付费用,我们可以为其提供专用的数据库服务器,从而为具有大量数据的客户提供帮助。
在这种情况下,还有一件事情真正帮助了我们,那就是Red Gate的工具,特别是Multi-Script、SQL Source Control和Schema Compare等工具。当我们升级某些内容并且模式发生变化时,我们必须将更改部署到所有相关的数据库中。这些工具节省了大量时间,已经超过了它们的成本。请注意,我与Red Gate没有任何关联,只是一个满意的用户。
编辑:(回应评论)
ApplicationData是每个产品的一个数据库。我们拥有的三个基于Web的产品使用相同的ApplicationData架构,因为它们记录基本相同类型的信息。然而,没有理由必须保持这种状态。ApplicationData数据库都在同一服务器上。ApplicationData中的一个表指向客户端MasterData的正确服务器和数据库名称,因此给定客户端的MasterData可以驻留在任何服务器上。
MasterData对于每个ClientData数据库都有服务器和数据库名称信息,因此数据库可以驻留在任何服务器上。实际上,目前我们只有两个生产数据库服务器用于这些产品。每个客户都有自己的MasterData。如果客户购买多个产品,则该客户的每个产品都有一个MasterData;如果客户已购买该功能(或请求定制开发此功能),则产品以其他方式进行交互(基本上通过Web服务)。给定产品的ClientData始终具有相同的架构。
因此,总之:
1. ApplicationData是每个产品的,恰好在每个产品中具有相同的架构。
2. MasterData是每个客户的产品。
3. 在产品中,一个客户有一个或多个ClientData实例。
我稍微简化了一下,只有我们的一个产品支持每个客户多个ClientData实例。对于第二个产品,这可能最终会被实现。对于第三个产品,作为一个功能毫无意义,可能仅保持不变。
希望这回答了你的问题!