数据点:Windows Azure 表存储:不同于传统数据库
2010-08-09 00:00:00 来源:WEB开发网还有别的信息能区分我们吗?我们生活在美国的两边,但位置可以改变,因此不能将位置作为键。我们的生日肯定不同(相差 20 多年),而且这个值是静态值。但是很有可能世界上的某个地方还有一位和我生日相同的 Julie Lerman,并存在我的数据库中 - 这虽然让人难以置信,但却有可能发生。仔细考虑所有因素后,生日仍然不是我的应用程序要搜索或排序的值。因此在这种情况下,RowKey 可以不包含在查询中,只用传统的 GUID 就足够了。您将不得不为所有的 Windows Azure 表进行类似的决策。
关于定义键还有很多内容要了解,检索数据、存储数据、可扩展性和负载平衡等因素也都需要考虑。
重新考虑关系
在关系数据库中,我们依赖外键和约束来定义关系。我们肯定可以在一个类中定义一个外键属性来引用另一个类,但 Windows Azure 表存储中没有用来实现关系的功能。您必须使用代码来构建关系。
这将影响您从表执行查询和更新(包括插入和删除)的方式。
进行查询时,您不能在表之间执行联接。处理数据的持久性时,您不能使用跨分区或表的事务命令。但是,正如我在本专栏开头所述,Windows Azure 表提供了处理图表中数据的机制:您可以在一个表中存储具有不同架构的行。
如果您的应用程序要求用户将联系人和地址放到一起处理,则您可以将地址和联系人存储在同一个表中。但务必确保地址具有相同的 PartitionKey,例如“lerman_julie”。另外,RowKey 应该包含可以指定实体类型或种类的值,例如“address_12345”,这样在进行查询时,您可以轻松地分辨联系人类型和地址类型。
通用的 PartitionKey 可确保各行始终在一起,以便利用名为实体组事务 (Entity Group Transactions, EGT) 的功能。此功能允许一个事务在多个实体之间以原子方式执行操作,只要所有实体具有相同的 PartitionKey 值即可。对相关数据使用 EGT 的优势之一,是您可以在一个事务中对所有实体执行事务处理更新。
继续学习的起点
Windows Azure 表在云计算环境中,但对我来说它们最初就是一团迷雾。由于关系数据库的概念已经先入为主,我在理解 Windows Azure 表时颇费一番周折。我做了很多工作(还请教了很多人),让自己摆脱 RDBMS 的固定思维模式,从而接受并真正欣赏 Windows Azure 表的卓越之处。我希望我的经历能让您更快完成转变。
本文示例源代码或素材下载
更多精彩
赞助商链接