希望你们中的一些人可能遇到这个要求: - 我有基于桌面的产品,我们计划将其带到云端。我们将在SQL-Azure中仅使用一个数据库并合并所有客户的数据库。对于合并,我们有以下选项: -
* 即可。将NewCustomerID和现有TableID作为复合主键。
专业人员 - 易于导出数据库,因为可以轻松导出相关表,并且主表可以使用外键。 - 从云端推送到内部部署数据库很容易实现
缺点 - 几乎每个表都有复合主键和 - 怀疑是否存在性能问题(在谷歌搜索之后,很多人认为,复合键不会导致性能问题)。 EF代码首先可能会引起一些问题。
* 即可。拥有新的自动增量主键,并且仍然维护,NewCustomerID和OLD TableID键
专业人员 - 表之间的关系将基于单键,并且易于编写查询和EF代码的第一关系。
缺点 - 一个额外的密钥和旧密钥的维护
请建议您的选择,或者您是否喜欢在sql azure中处理此类场景的新方法
答案 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)