Database design 在一个云数据库中合并多个客户数据库

Database design 在一个云数据库中合并多个客户数据库,database-design,entity-framework-4.1,relational-database,foreign-key-relationship,azure-sql-database,Database Design,Entity Framework 4.1,Relational Database,Foreign Key Relationship,Azure Sql Database,希望你们中的一些人可能已经面临这一要求:- 我有一个基于桌面的产品,我们计划把它带到云端。我们将在SQLAzure中只使用一个数据库,并合并所有客户的数据库。对于合并,我们有以下选项:- *。将NewCustomerID和现有TableID作为复合主键 优点-易于导出db,因为导出相关表很容易,外键在主表中可用。 -很容易将云推回到内部数据库 缺点-几乎每个表都有复合主键和 -许多人认为,谷歌搜索后是否存在性能问题值得怀疑,因为复合键不会导致性能问题。EF代码首先可能会导致一些问题 *。具有新的

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

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

优点-易于导出db,因为导出相关表很容易,外键在主表中可用。 -很容易将云推回到内部数据库

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

*。具有新的自动递增主键,并且仍然保持新的CustomerID和旧的TableID键

优点-表之间的关系将基于单键、易于编写的查询和EF代码优先关系

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

请建议您的选择,或者您是否喜欢全新的方式来处理SQLAzure中的此类场景

优点-表之间的关系将基于单键,并且 易于编写查询和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)
因为这将允许客户A使用Azure的行

优点-表之间的关系将基于单键,并且 易于编写查询和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)

因为这将允许客户A使用Azure的行

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

我建议您查找类似的


您可能还想好好看看这篇关于

免责声明的精彩文章:我假设这是一个多租户问题

我建议您查找类似的


您可能还想好好看看这篇文章,这是SQLAzure中不断增长的需求。然而,我要指出的一点是,将所有客户数据库整合到单个SQLAzure数据库中并不一定是一种可扩展的设计。事实上,云计算是要向外扩展,而不是向上扩展。因此,设计一个旨在扩展的数据库有些冒险。请注意,SQLAzure有一个内置的节流机制,可以阻止长时间运行的查询、过度使用资源等;这种节流机制在某种程度上是对放大设计模式的保护

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

按客户ID将客户记录整合到单个数据库中,然后计划稍后使用SQL Azure Data Federation注意:一些关键限制适用;这项功能的可用性目前还不清楚,但预计今年晚些时候会发布公告

使用可伸缩性框架,如Enzo框架,尽可能透明地创建碎片免责声明:我是这项技术的作者。该技术允许您将客户数据库存储在不同的数据库、数据库模式或两者的组合中,并在将来支持SQL Azure Data Federation

不需要将所有客户记录扩展到一个数据库实例中,并且未来的扩展计划和性能将不再是一个问题,在这种情况下,您可以使用电子邮件中描述的方法,使用某种类型的客户ID逻辑地分离记录

汇总您自己的数据库模式分离逻辑,其中每个数据库模式包含不同类型的表 客户;使用将客户登录指向正确数据库架构的中心表


这是SQLAzure中日益增长的需求。然而,我要指出的一点是,将所有客户数据库整合到单个SQLAzure数据库中并不一定是一种可扩展的设计。事实上,云计算是要向外扩展,而不是向上扩展。因此,设计一个旨在扩展的数据库有些冒险。请注意,SQLAzure有一个内置的节流机制,可以阻止长时间运行的查询、过度使用资源等;这种节流机制在某种程度上是对放大设计模式的保护

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

按客户ID将客户记录整合到单个数据库中,然后计划稍后使用SQL Azure Data Federation注意:一些关键限制适用;这项功能的可用性目前还不清楚,但预计今年晚些时候会发布公告

使用可伸缩性框架,如Enzo框架,尽可能透明地创建碎片免责声明:我是这项技术的作者。该技术允许您将客户数据库存储在不同的数据库、数据库模式或两者的组合中,并在将来支持SQL Azure Data Federation

不需要将所有客户记录扩展到一个数据库实例中,并且未来的扩展计划和性能将不再是一个问题,在这种情况下,您可以使用电子邮件中描述的方法,使用某种类型的客户ID逻辑地分离记录

汇总您自己的数据库模式分离逻辑,其中每个数据库模式包含不同客户的表;使用将客户登录指向正确数据库架构的中心表


您提到的缺陷在技术上是可能的,尽管我们可以通过允许客户始终处理其数据的内部机制来避免,但正如您所提到的,最好在复合密钥上使用引用密钥。但对于我的第一个选择,我最终在sqlAzure中将PK作为我数据库的每个表的复合键,可以吗?再次感谢Tim,你引导了我正确的方向。出于安全原因,我似乎别无选择,只能在SQLAzure的几乎每个db中使用复合主键。等待sql federation Service您提到的缺陷在技术上是可能的,尽管我们可以通过允许客户始终处理其数据的内部机制来避免,但正如您所提到的,最好在复合密钥上具有引用密钥。但对于我的第一个选择,我最终在sqlAzure中将PK作为我数据库的每个表的复合键,可以吗?再次感谢Tim,你引导了我正确的方向。出于安全原因,我似乎别无选择,只能在SQLAzure的几乎每个db中使用复合主键。然后等待sql联合服务谢谢Herve。你的链接和所有的要点帮助我深入思考。我会选择你回答中提到的第一个和第三个选项。谢谢Herve。你的链接和所有的要点帮助我深入思考。我会选择你回答中提到的第一个和第三个选项。