技术开发 频道

Azure Services探索:存储之表(Table)存储

  现在我们假设你要为中国移动设计一个Azure 版本的应用,就表存储设计来说,你将整个中国移动的客户放在一个表里可能定是不现实的,你一定会考虑分区,PartitionKey可以是地域属性,比如你按省来分区;RowKey是手机号码;你也可以将PartitionKey设定成移动业务的品牌;RowKey是手机号码;也许这样你还决得大,你会将一个省的客户数据放到一个表里,实体变成了广东省移动客户,这样PartitionKey可以变成省下面的地州市,比如广州市,深圳….RowKey是手机号码,甚至你还是觉得不够细,你可以将广州市的用户放到一个表里,实体变成了广州市移动客户,PartitionKey可以变成市下面的区,比如白云区,天河区,RowKey可以换成业务类型;甚至你还想细分……所以,上面说了数据的细分或说颗粒化取决于应用,但你应该了解Windows Azure的设计和规则。

  针对规则4,这也可能涉及到实体的单表扩展还是多表扩展,也会涉及到一个实体对应多个表,多个实体对应一个表,一个实体在不同状态下有不同数量/动态的属性等等这样的设计难题和争议。我就不涉及太多。

  规则5:每个实体最多拥有255个属性,但自定义的只有253个甚至更少一些,因为所有的实体都有两个固定的关键属性PartitionKey和RowKey。属性的定义和定义脚本是相当灵活和没有限制的,比如可以将两个不同属性/不同属性个数的实体定义在一个表中。

  了解了上面的这些规则,只完成了我们第一项工作,Azure表存储的概念和设计概念。真正的如何定义表的操作,以及访问表存储是我们接下来要做的。

  Azure 表存储的访问技术是最眩和最新的技术,比如完全兼容ADO.NET data services,使用最新的.NET 3.5 SP1中的.NET Client 类库访问,编程查询语言使用LINQ……. Windows Azure平台的开发模型涵盖了微软最新的所有的先进技术,这样不枉费各位粉丝从.NET 1.0到.NET 4.0的追随和勤奋学习,这下总算有用武之地了。

  而后我就转到一个最简单的表存储的Azure 的应用,来演练和探索一些Azure表存储的基本操作和编程技术。因为如果了解了上述的规则和设计要点,我认为基本是掌握Azure表存储技术的关键,后面的过程都是看图说话和一些体力活-操作键盘和鼠标。

  接下来你可以选择按照Jim Nakashima的文章Windows Azure Walkthrough: Simple Table Storage来体验,也可以继续按下面的步骤体验,我的操作选自Azure Services Training Kit - PDC Preview的一个练习,两者的差别是Jim Nakashima的文章涉及更多的一些话题Create Tables Only Once这样有关高性能的示范,因为Jim Nakashima决定他应该提供高质量的示范代码J

这个练习主要是熟悉表存储的创建和访问,运行后的界面如下图:

  对于这样一个简单的聊天留言板,数据表更是简单,基本上是一个叫聊天消息的实体,实体有两个属性/字段,聊天人的名字(Name)和聊天内容(Body),当然根据上面的规则,还有ParitionKey 和RowKey这两个关键和固定字段。

首先依然是向上一篇访问队列那样,进行Azure服务的定义和配置。分别定义TableStorageEndpoint,AccountName和AccountSharedKey的属性

  服务定义文件ServiceDefinition.csdef, 这个例子还没有用到Worker Role ,也可不配置

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="WorkingWithTables" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<WebRole name="WebRole">
<ConfigurationSettings>
<Setting name="TableStorageEndpoint"/>
<Setting name="AccountName"/>
<Setting name="AccountSharedKey"/>
</ConfigurationSettings>
<InputEndpoints>
<!-- Must use port 80 for http and port 443 for https when running in the cloud -->
<InputEndpoint name="HttpIn" protocol="http" port="80" />
</InputEndpoints>
</WebRole>
<WorkerRole name="WorkerRole">
<ConfigurationSettings>
<Setting name="TableStorageEndpoint"/>
<Setting name="AccountName"/>
<Setting name="AccountSharedKey"/>
</ConfigurationSettings>
</WorkerRole>
</ServiceDefinition>

  服务配置文件ServiceConfiguration.cscfg中,定义在服务定义文件中各个参数的值

<?xml version="1.0"?>
<ServiceConfiguration serviceName="WorkingWithTables" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration">
<Role name="WebRole">
<Instances count="1"/>
<ConfigurationSettings>
<Setting name="TableStorageEndpoint" value="http://127.0.0.1:10002"/>
<Setting name="AccountName" value="devstoreaccount1"/>
<Setting name="AccountSharedKey" value="Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="/> </ConfigurationSettings>
</Role>
<Role name="WorkerRole">
<Instances count="1"/>
<ConfigurationSettings>
<Setting name="TableStorageEndpoint" value="http://127.0.0.1:10002"/>
<Setting name="AccountName" value="devstoreaccount1"/>
<Setting name="AccountSharedKey" value="Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="/> </ConfigurationSettings>
</Role>
</ServiceConfiguration>

  Azure 服务的表存储存取API,依然是采用了SDK中的StorageClient 类库,然后分别在Web Role项目中添加StorageClient的引用

  接下来的步骤是关于表存储种中比较重要的一个工作,那就是建立一个实体类与表模型的脚本。

0
相关文章