在一个Cloud DB中合并多个客户数据库

时间:2011-07-20 16:54:58

标签: database-design entity-framework-4.1 relational-database foreign-key-relationship azure-sql-database

希望你们中的一些人可能遇到这个要求: - 我有基于桌面的产品,我们计划将其带到云端。我们将在SQL-Azure中仅使用一个数据库并合并所有客户的数据库。对于合并,我们有以下选项: -

* 即可。将NewCustomerID和现有TableID作为复合主键。

专业人员 - 易于导出数据库,因为可以轻松导出相关表,并且主表可以使用外键。      - 从云端推送到内部部署数据库很容易实现

缺点 - 几乎每个表都有复合主键和      - 怀疑是否存在性能问题(在谷歌搜索之后,很多人认为,复合键不会导致性能问题)。 EF代码首先可能会引起一些问题。

* 即可。拥有新的自动增量主键,并且仍然维护,NewCustomerID和OLD TableID键

专业人员 - 表之间的关系将基于单键,并且易于编写查询和EF代码的第一关系。

缺点 - 一个额外的密钥和旧密钥的维护

请建议您的选择,或者您是否喜欢在sql azure中处理此类场景的新方法

3 个答案:

答案 0 :(得分:2)

  

专业 - 表之间的关系将基于单个键,和   易于编写查询和EF代码的第一个关系。

不正确或不太正确。取决于你所说的“关系”。见下文。

使用单列自动递增主键可以使许多事情变得更简单,我可以推荐它。但是您的场景中的引用完整性约束仍然需要创建备用复合(双列)键,因为它是那些将参与约束的复合键。

为清晰起见的一个例子:

           Customer A might not have "Azure" in their colors table
           Customer B might have "Azure" in their colors table.

现在,两个客户的颜色表中的行已合并到一个表中:

          COLORS
          id integer primary key
          customerid
          colorname

因此,在假设的产品表中,您需要这样:

           PRODUCTS
           id integer primary key
           customerid
           colorid

           alter table PRODUCTS add constraint
           FK_PRODUCTS_COLORS
           foreign key(colorid, customerid) references COLORS(id, customerid)

你不能简单地这样做:

           alter table PRODUCTS add constraint
           FK_PRODUCTS_COLORS
           foreign key(colorid) references COLORS(id)

这将允许CUSTOMER A将该行用于“Azure”。

答案 1 :(得分:2)

这是SQL Azure中不断增长的需求。但有一点我要指出的是,将所有客户数据库整合到一个SQL Azure数据库中并不一定是可扩展的设计。实际上,云计算是向外扩展,而不是向上扩展。因此,设计一个旨在扩大规模的数据库是一个有点冒险的主张。请注意,SQL Azure具有内置限制机制,可阻止长时间运行的查询,过度使用资源等等;这种限制机制在某种程度上可以防止扩大设计模式。

在针对SQL Azure设计数据库时,您基本上有以下选项:

  • 按客户ID在单个数据库中合并客户记录,然后计划稍后使用SQL Azure数据联合(注意:某些关键限制适用;此功能的可用性尚不清楚,但是公开公告在今年晚些时候有所预期)。 Read into article from Cihan

  • 使用可扩展性框架(如Enzo Framework)尽可能透明地创建分片(免责声明:我是此技术的作者)。该技术允许您将客户数据库存储在不同的数据库,数据库模式或两者的混合中,以及将来对SQL Azure数据联合的支持。 Read my white paper on the topic

  • 无需扩展(所有客户记录都适合单个数据库实例并且未来可扩展计划)并且性能不会受到影响,在这种情况下,您可以使用电子邮件中描述的方法(使用逻辑上单独记录的某种客户ID)

  • 汇总您自己的数据库架构分离逻辑,其中每个数据库架构包含不同客户的表;使用中央表将客户登录指向正确的数据库架构。 Read a high level description on MSDN here

答案 2 :(得分:0)

免责声明:我假设这是一个多租户问题。

我建议您查找类似的thread

你可能还想好好看看SQL Azure FederationSQL Azare Sharding

上的好文章