Windows Azure:BlobとTableは互いに補完します

クラウドコンピューティングが普及しています。 多くの人々がこの事実を認識しており、アプリケーションを「クラウド」に転送するための手段をすでに取っています。 私たちのプロジェクトでそれが起こりました、顧客は彼が「雲の中で舞い上がりたい」と言いました。 なぜなら アプリケーションはSilverlightで開発されたため、クラウドを選択することに疑いの余地はなく、Windows Azureを使用することが決定されました。



他のタスクの中でも、「クラウド」に移行すると、アプリケーションテンプレートの構造化ストレージの問題が発生しました。 Windows Azureは、Windows Azureストレージサービス用にいくつかのストレージオプションを提供します。 キューは明らかに現在のタスクに適していないため、BlobとTableのどちらかを選択する必要があります。 さらに理解しています。



一見、Tableは完璧にフィットしますが、一見しただけです。 プリミティブクエリを実行し、興味のある行のみを取得できます。Guidレコードのプロパティに別のレコードを配置することで、オブジェクトの階層を整理できます。 この分野の知識を深めると、各レコードは255フィールドを超えることはできません(これは私たちにとっては重要ではありません)最後に、各プロパティのサイズは64 kBを超えることはできませんが、この段階では既に最大300 kBのサイズのテキストを保存する必要があるため、これに我慢できません。



そして、Blobはどうですか? Blob-sを使用すると、現在のタスクのサイズが200 GBの面白い制限でレコードを保存でき、異なるコンテナーに配置して仮想フォルダーを使用してデータを構造化できるため、各Blobには合計サイズ8 kBのメタデータを付随させることができます。 間違いなくBlobのように見えるでしょうか? 再びいいえ! ブロブを選択することはできません。リクエストに応じて検索を実行するメカニズムはありません(いずれの場合も見つかりませんでした)。 あなたは尋ねます:「メタデータはどうですか? 結局、そこに構造に関する情報を配置できます!」そして、ほぼ正しいでしょう。Blobコンテンツなしでメタデータを取得し、選択するLINQクエリを作成することもできますが、コンテナー内のすべてのBlobのすべてのメタデータを受け取った後にこれを行う必要があります。 また、多数の要素があると、コストのかかる操作になります。



それでは、Windows Azureを使用しても問題を解決できませんか? もちろんできます! そして、私たちは方法を見つけました。多分それは完璧ではありませんが、私たちは完全に満足しています。 データ自体をBlobに保存し、データ構造に関する情報をテーブルに保存することが決定されました。 したがって、これらの2つの技術を組み合わせて、欠点を補い、活用します。



そして最後に、上に書かれたすべてを説明する少しのコード。 まず、テーブルストレージへのアクセスを容易にするラッパークラスを作成します。

public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  1. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  2. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  3. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  4. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  5. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  6. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  7. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  8. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  9. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  10. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  11. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  12. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  13. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  14. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  15. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  16. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  17. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  18. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  19. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  20. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  21. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  22. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  23. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  24. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  25. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  26. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  27. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  28. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  29. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  30. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  31. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



  32. public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .



public class DynamicTableServiceContext<T> : TableServiceContext where T : TableServiceEntity { private CloudStorageAccount storageAccount; private string tableName; public DynamicTableServiceContext(CloudStorageAccount storageAccount, string tableName) : base (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials) { this .storageAccount = storageAccount; this .tableName = tableName; var tableStorage = new CloudTableClient(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials); tableStorage.CreateTableIfNotExist(tableName); } public void Add(T entityToAdd) { AddObject(tableName, entityToAdd); SaveChanges(); } public void Update(T entityToUpdate) { UpdateObject(entityToUpdate); SaveChanges(); } public void Delete(T entityToDelete) { DeleteObject(entityToDelete); SaveChanges(); } public IQueryable<T> Load() { return CreateQuery<T>(tableName); } } * This source code was highlighted with Source Code Highlighter .





次に、レコードのエンティティを作成します。





  1. パブリック 列挙型 ElementType
  2. {
  3. Obj = 1
  4. ObjCategory = 2
  5. }
  6. パブリック クラス BaseObjTableEntity:TableServiceEntity
  7. {
  8. public virtual int Type { get ; セット ; }
  9. パブリック ストリング Name { get ; セット ; }
  10. }
  11. パブリック クラス ObjTableEntity:BaseObjTableEntity
  12. {
  13. パブリック ストリング説明{ get ; セット ; }
  14. パブリック ストリング CategoryId { get ; セット ; }
  15. パブリック オーバーライド int
  16. {
  17. get { returnint )ElementType.Obj; }
  18. {}を設定
  19. }
  20. }
  21. パブリック クラス ObjCategoryTableEntity:BaseObjTableEntity
  22. {
  23. パブリック オーバーライド int
  24. {
  25. get { returnint )ElementType.ObjCategory; }
  26. {}を設定
  27. }
  28. }
*このソースコードは、 ソースコードハイライターで強調表示されました。


このタスクでは、各ユーザーのオブジェクトをカテゴリ別に保存する必要があるため、オブジェクトとオブジェクトのカテゴリを1つのテーブルに保存することが決定されました(これがAzure Table Storageが提供するものです)。 テーブル内のレコードを区別するために、オブジェクトにはオブジェクトのタイプに関する情報を格納するフィールドがあります。 便宜上、これは列挙型ElementTypeの形式で行われます。 エントリの基本クラスはBaseObjTableEntityで、カテゴリとオブジェクトのクラスはそれぞれObjCategoryTableEntityとObjTableEntityです。



抽象TableServiceEntityクラスには、PartitionKey、RowKey、およびTimestampの3つのプロパティが含まれています。 最初の2つは複合キーとして使用され、同じPartitionKeyを持つレコードは常に同じサーバー内にあるため、ユーザーIDをこのプロパティに転送することにしました。 カテゴリのRowKeyはカテゴリのGuidであり、オブジェクトのRowKeyはBlobの名前であるGuidです。 したがって、オブジェクト自体はBlob-sに格納されます。それらを操作するために、単純なクラスを作成します。





  1. パブリック クラス ObjBlob
  2. {
  3. パブリック ストリングコンテンツ{ get ; セット ; }
  4. パブリック ストリング Name { get ; セット ; }
  5. }
*このソースコードは、 ソースコードハイライターで強調表示されました。


そして最後に、これらすべてを処理するクラス:





  1. パブリック クラス ObjAzureRepository
  2. {
  3. private const string ObjContainerName = "objlibrary";
  4. private const string ObjTableName = "ObjLibrary";
  5. private const string DefaultPartitionKey = "Default";
  6. プライベート 読み取り専用 ストリング userID;
  7. public ObjAzureRepository( string userId)
  8. {
  9. this .userID = userId;
  10. }
  11. プライベート 文字列 azureStorageConnectionString;
  12. 保護された 文字列 AzureStorageConnectionString
  13. {
  14. 得る
  15. {
  16. ifstring .IsNullOrWhiteSpace(azureStorageConnectionString))
  17. {
  18. azureStorageConnectionString = WebConfigurationManager.ConnectionStrings ["AzureStorageConnectionString"]。ConnectionString;
  19. }
  20. return azureStorageConnectionString;
  21. }
  22. }
  23. プライベート CloudStorageAccount azureStorageAccount;
  24. 保護された CloudStorageAccount AzureStorageAccount
  25. {
  26. 得る
  27. {
  28. azureStorageAccountを返しますか? (azureStorageAccount = CloudStorageAccount.Parse(AzureStorageConnectionString));
  29. }
  30. }
  31. private DynamicTableServiceContext <ObjCategoryTableEntity> categoryContext;
  32. private DynamicTableServiceContext <ObjCategoryTableEntity> CategoryContext
  33. {
  34. 得る
  35. {
  36. if (categoryContext == null
  37. {
  38. categoryContext = new DynamicTableServiceContext <ObjCategoryTableEntity>(AzureStorageAccount、ObjTableName);
  39. }
  40. return categoryContext;
  41. }
  42. }
  43. private DynamicTableServiceContext <ObjTableEntity> ObjContext;
  44. private DynamicTableServiceContext <ObjTableEntity> ObjContext
  45. {
  46. 得る
  47. {
  48. if (ObjContext == null
  49. {
  50. ObjContext = new DynamicTableServiceContext <ObjTableEntity>(AzureStorageAccount、ObjTableName);
  51. }
  52. ObjContextを返します。
  53. }
  54. }
  55. public List <ObjCategoryTableEntity> GetObjCategories()
  56. {
  57. Return CategoryContext.Load()。Where <ObjCategoryTableEntity>(e => e.PartitionKey == userID && e.Type ==( int )ElementType.ObjCategory).ToList();
  58. }
  59. public List <ObjTableEntity> GetObjsByCategory(ObjCategoryTableEntityカテゴリー)
  60. {
  61. return ObjContext.Load()。Where(s => s.PartitionKey == userID && s.CategoryId == category.RowKey && s.Type ==( int )ElementType.Obj).ToList();
  62. }
  63. パブリック ObjBlob GetObjById( 文字列 ID)
  64. {
  65. CloudBlobClientクライアント= AzureStorageAccount.CreateCloudBlobClient();
  66. CloudBlobContainer container = client.GetContainerReference(ObjContainerName);
  67. container.CreateIfNotExist();
  68. CloudBlob Obj = container.GetBlobReference(id);
  69. return new ObjBlob(){Name = id、Content = Obj.DownloadText()};
  70. }
  71. public void AddCategory(ObjCategoryTableEntityカテゴリー)
  72. {
  73. CategoryContext.Add(カテゴリ);
  74. }
  75. public void ChangeCategory(ObjCategoryTableEntityカテゴリー)
  76. {
  77. CategoryContext.Update(カテゴリ);
  78. }
  79. public void RemoveCategory(ObjCategoryTableEntityカテゴリー)
  80. {
  81. CategoryContext.Delete(カテゴリ);
  82. }
  83. public void AddObj(ObjTableEntity Obj、 ストリング ObjContent)
  84. {
  85. ObjContext.Add(Obj);
  86. CloudBlobClientクライアント= AzureStorageAccount.CreateCloudBlobClient();
  87. CloudBlobContainer container = client.GetContainerReference(ObjContainerName);
  88. container.CreateIfNotExist();
  89. CloudBlob ObjBlob = container.GetBlobReference(Obj.RowKey);
  90. ObjBlob.UploadText(ObjContent);
  91. }
  92. public void ChangeObj(ObjTableEntity Obj)
  93. {
  94. ObjContext.Update(Obj);
  95. }
  96. public void RemoveObj(ObjTableEntity Obj)
  97. {
  98. ObjContext.Delete(Obj);
  99. }
  100. }
*このソースコードは、 ソースコードハイライターで強調表示されました。


カテゴリの操作は非常に簡単です。AddObjオブジェクトを追加する方法だけが特別な注意に値します。テーブルへのエントリの追加に加えて、オブジェクトのコンテンツとともにBlobも追加され、IDでコンテンツを取得できます。



したがって、テーブル(クラウド側でレコードを選択する機能)とBlob-s(実質的に無制限のボリュームの要素のストレージ)の両方の利点を使用しながら、それらの欠点を回避します。



基本的に私が共有したかったのはこれだけです。おそらくそれは誰かにとって明白であり、彼はすでにそれを100回やったことがありますが、誰かにとってはそれは良い興味深い素材であり、「クラウド」への移行を支持する別のポイントになります。



All Articles