Database design 在一个云数据库中合并多个客户数据库
希望你们中的一些人可能已经面临这一要求:- 我有一个基于桌面的产品,我们计划把它带到云端。我们将在SQLAzure中只使用一个数据库,并合并所有客户的数据库。对于合并,我们有以下选项:- *。将NewCustomerID和现有TableID作为复合主键 优点-易于导出db,因为导出相关表很容易,外键在主表中可用。 -很容易将云推回到内部数据库 缺点-几乎每个表都有复合主键和 -许多人认为,谷歌搜索后是否存在性能问题值得怀疑,因为复合键不会导致性能问题。EF代码首先可能会导致一些问题 *。具有新的自动递增主键,并且仍然保持新的CustomerID和旧的TableID键 优点-表之间的关系将基于单键、易于编写的查询和EF代码优先关系 缺点-一个额外的钥匙和旧钥匙的维护 请建议您的选择,或者您是否喜欢全新的方式来处理SQLAzure中的此类场景 优点-表之间的关系将基于单键,并且 易于编写查询和EF代码优先关系 不正确或不完全正确。这取决于你所说的关系。见下文 拥有一个单列自动递增主键可以简化很多事情,我可以推荐它。但是,场景中的引用完整性约束仍然需要创建备用的复合两列键,因为约束中涉及的是那些复合键 为了清楚起见,举一个例子: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代码首先可能会导致一些问题 *。具有新的
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。你的链接和所有的要点帮助我深入思考。我会选择你回答中提到的第一个和第三个选项。