共用方式為


本文章是由機器翻譯。

資料點

Windows Azure 表格儲存體 – 不您父親 ’s 資料庫

Julie Lerman

下載程式碼範例

Windows Azure 表格儲存會導致大量 scratching 開發人員之間的標頭。大部分的資料儲存他們是經驗的使用有各種不同的資料表,每一個包含一組預先定義的資料行一或多個這通常被指定為識別機碼的關聯式資料庫。資料表使用這些機碼,來定義一個 another.Windows Azure 存放區資訊使用一些的方法之間的關係,但兩把焦點放在保存的結構化資料,是 SQL Azure] 和 [Windows Azure 資料表的儲存體。第一個是一個關聯式資料庫,並與 SQL Server 相當接近對齊。它有具有已定義的結構描述、 索引鍵、 關聯性和其他的限制式的資料表,而且您連線到使用連接字串,就像您平常與 SQL Server 和其他的資料庫。

Windows Azure 表格儲存體,手,似乎有點神秘的我們,是用來處理關聯式資料庫。雖然您找到許多傑出的解說建立的應用程式,使用 Windows Azure 表格儲存體,許多開發人員會仍然發現本身不真正了解什麼它 ’s 所有相關的情況下進行的信心 leaps 強制。

此資料行可幫助那些困在探索的信心與實心地面的關聯式思考觀點說明 Windows Azure 表格儲存體的一些核心概念的關聯式模式橋接器。而且,我介紹一些重要的策略,您預期來查詢和更新資料的方式而定的該資料表的設計。

將資料儲存為有效的擷取和保存性

由設計,Windows Azure 表格服務會提供可能會儲存資料,龐大的大量時啟用有效率的存取和保存性。服務簡化從跳到使用關聯式資料庫所需的所有 hoops 儲存您的儲存體 (條件約束、 檢視表、 索引、 關聯性和預存程序。您只需處理資料]、 [資料]、 [資料。Windows Azure 資料表使用啟用有效率的查詢的金鑰,並且您可以採用一個 — [PartitionKey — 負載平衡時表格服務會決定它 ’s 資料表分散多部伺服器的時間。資料表 doesn’t 有指定的結構描述。它 ’s 只是一種結構化的容器的資料列 (或實體),doesn’t 處理資料列的外觀。您可以有的資料表來存放一個特定的型別,但是您也可以儲存不同的結構與資料列在單一資料表中 的 圖 1 所示。

圖 1 Azure 資料表可以包含一個單一 Windows 資料列代表類似或不同實體

它會全部開始於您的網域類別

資料庫與我們一般的開發程序是建立它們、 定義資料表中,然後,針對每個的資料表定義特定的結構 (每個都有指定的資料型別特定欄 — 以及其他資料表的關聯。資料和提取資料的資料表,然後推入我們的應用程式。

使用 Windows Azure 表格的服務雖然,您 don’t 設計一個的資料庫只是您的類別。您為資料列,定義您的類別和容器隸屬於的一或多個類別,然後您就可以儲存執行個體化的物件 (資料表) 回至存放區。

除了屬性,您必須在您的類別中,每個類別都必須有重要決定 Windows Azure 表格服務如何執行其工作的三個屬性:PartitionKey、 RowKey 和時間戳記。PartitionKey 和 RowKey 是兩者的字串,並有 ’s 定義它們,所以在執行階段取得的查詢和交易的效率,以及與延展性的最佳平衡的一個美工圖案 (或可能是科學)。為瞭解如何定義 PartitionKeys RowKeys 的大部分的好處的我強烈建議 PDC09 工作階段 「 Windows Azure 資料表和佇列 Deep 剖析,」 提供用來在 microsoftpdc.com/sessions/svc09 您可以監看它的 Jai Haridas。

PartitionKeys 和 RowKeys 磁碟機效能及延展性

許多開發人員都用來為系統的主索引鍵、 外部索引鍵和兩者之間的條件約束。Windows Azure 表格儲存體,您必須讓這些概念移或遇到困難取得其系統的機碼。

在 Windows Azure 資料表、 字串 PartitionKey 和 RowKey 屬性工作資料表的索引為一起,所以定義它們時, 必須考慮如何您的資料查詢。一起,屬性也提供做為資料列的主索引鍵的唯一性規定。在一個資料表中的每個實體都必須有唯一的 PartitionKey/RowKey 組合。

但是,您需要考慮多個查詢 [定義一個的 PartitionKey 時,因為它也用於實體分割在的資料表可提供負載平衡和擴充性。就例如考慮包含食物的相關資訊,並有 PartitionKeys Vegetable、 水果及粒紋食物的型別與對應的資料表。在夏天,theVegetable 磁碟分割中的資料列可能非常忙碌 (成為所謂的 「 作用中 」 磁碟分割)。服務可以載入的平衡食物表格,藉由將 Vegetable 磁碟分割移到不同的伺服器,以 
better 處理多對磁碟分割的要求。

如果您預期比單一伺服器可以處理多個該磁碟分割活動,您應該考慮建立更細微的分割區,例如 Vegetable_Root 和 Vegetable_Squash。這是因為資料粒度負載平衡的單位是 [PartitionKey。具有相同的 PartitionKey 值的所有資料列保存在同負載平衡時。您甚至可能設計您的資料表,讓每個資料表中的單一實體有不同的磁碟分割。

到 PartitionKeys 深入探究和查詢

請注意當我建議微調 Vegetable PartitionKeys,我放 Vegetable 索引鍵不是最後的開頭。’s 啟用更有效率的查詢的另一種機制。從 Microsoft.NET Framework Windows Azure 資料表的查詢使用 LINQ to REST 和衍生自 WCF 資料服務 System.Data.Services.Client.DataServiceContext 的內容。如果您想要尋找任何綠色 squash 您可以搜尋 Vegetable_Squash 磁碟分割中沒有浪費資源,若要搜尋整張表格:

var query = _serviceContext.FoodTable.AsTableServiceQuery()
.Where(c => c.PartitionKey=="Vegetable_Squash"&& c.Color == "Green");

查詢由 WCF 資料服務傳回 OData 大差異,並針對 Windows Azure 表格的查詢是不支援的字串函式。 如果想要搜尋的字串的部分必須使用 String.CompareTo 來檢查字串的開頭字元。 如果您想要查詢整個 Vegetable 類別但是,您可以如何透過 [PartitionKey 開頭的前置詞搜尋使用 CompareTo 方法:

var query = _serviceContext.FoodTable.AsTableServiceQuery()
            .Where(c => c.PartitionKey.CompareTo("Vegetable")>=0
            && c.PartitionKey.CompareTo("Vegetablf")<0
            && c.Color == "Green");

這會限制只以 Vegetable 開頭的磁碟分割來搜尋 — 任何較少、 什麼都沒有更多。 (第二個述詞中使用 Vegetablf,而不是 Vegetable 定義上限防止食物,例如 Yogurt 或 VegetableLike 的磁碟分割中,傳回)。在程式碼範例中所附本文,請參閱我如何動態地完成這個取代。

平行查詢的完整資料表掃描

如果您正在搜尋所有的綠色食物,不論型別吗? Windows Azure 必須掃描整個資料表。 如果它 ’s 大型資料表時,Windows Azure 擲回另一個 wrench 中:在時間 (或 5 秒的程序),它可以傳回只有 1000 個資料列。 Windows Azure 會傳回連同 接續機碼 ,這些結果,然後如需詳細資訊,請回到上一步。 這可以是冗長乏味的同步處理程序。

而是可以執行查詢,數的字 (也許逐一查看類別目錄,已知的清單,然後建立每一個查詢):

_serviceContext.FoodTable.AsTableServiceQuery()
.Where(c => c.PartitionKey == _category && c.Color == "Green");

然後您可以關閉所有查詢傳送給以平行方式執行。

更多的查詢的設計考量

RowKey 屬性做用途的數的字。 搭配 PartitionKey,它可以定義資料表中,每個資料列的唯一性。 我知道其他鄭 Lerman 的就例如 (真正我做)。 所以在 RowKey 將會在當我們分享的 lerman_julie 的 PartitionKey 區別我們要徑。 您也可以使用來幫助您進行排序,RowKey,因為它做為索引的一部份。 因此就再什麼是有用的 RowKeys 鄭 Lerman (亦 ’s 我) 的 elder 和鄭 Lerman younger? GUID 肯定會執行為識別,技巧,但不執行任何動作的搜尋或排序。 在這種情況下的值組合可能會是最好的選擇。

還有什麼區別我們? 我們住在美國] 狀態的相反的端點上,但位置可能變更,因此,不 ’s 有用的索引鍵。 當然我們的出生日期是不同 (由超過 20 年),而且,’s 靜態值。 但 ’s 永遠與我的生日的另一個鄭 Lerman 存在世界中的某處,並可以讓我的資料庫中的機率 (高度 implausible,但並非不可能。 畢竟 deliberation,我可能會經過的出生日期可能仍然無法搜尋或排序我的應用程式是一個值。 因此在這種情況下 RowKey 可能不是查詢,部分和純舊 GUID 會就夠了。 您需要進行這類的所有您 Windows Azure 資料表的決策。

有 ’s 更深入了解定義機碼,並放到播放因素,例如擷取儲存資料、 擴充性和負載平衡的資料。

rethinking 關聯性

在關聯的資料庫我們依賴外部索引鍵和條件約束定義的關聯。 我們當然可以定義外部索引鍵屬性參考到另一個的類別的類別中,但有 ’s 執行任何動作來強制實施關聯性的 Windows Azure 表格儲存體中。 您的程式碼仍然會負責的。

這會影響如何從資料表執行查詢及更新 (包括插入和刪除)。

查詢時, 您 can’t 執行跨資料表的聯結。 和保存資料時, 您 can’t 有交易跨越磁碟分割或資料表的命令。 沒有,不過,圖表,這是我指出此資料行的開頭的項目資料所使用的一種機制,您可以在單一資料表中儲存不同的結構描述的資料列。

如果您的應用程式需要的使用者使用的連絡人與地址一起,您可以儲存連絡人與相同的資料表中的地址。 將很重要,請確定 [地址有相同 PartitionKey — 比方就說 「 lerman_julie 」。而且,[RowKey 應該包含指定型別或類型,例如 「 address_12345,」 的實體的讓您可以輕鬆地區分連絡人類型] 和 [地址類型查詢時的值。

一般 PartitionKey 可確保資料列會永遠保持一起利用稱為實體群組交易 (EGT) 的功能。 這可讓執行作業完整跨多個項目,只要所有實體都擁有相同的 PartitionKey 值的單一交易。 其中一個優點 EGT 到相關的資料是您可以在單一交易中的所有項目上執行交易的更新。

從哪些進一步了解的是基底

Windows Azure 資料表住在定域機組,但我他們開始在一個霧化。 我必須取得我的頭包裝它們周圍,因為我 preconceived 瞭解關聯式資料庫的問題很多。 我有許多工作 (及 pestered 很多人),讓自己讓移的 RDBMS 錨點,讓我可以運用,真的很欣賞 Windows Azure 資料表的優點。 我希望我的旅程會使您較短。

有 ’s 因此更多要深入了解 [Windows Azure 表格的服務。 在 Microsoft 團隊會有一些很棒的指引,在 MSDN 上的位置。 除了稍早提到 PDC09 視訊,檢查 Windows Azure 存放小組部落格,在 blogs.msdn.com/windowsazurestorage/archive/2010/03/28/windows-azure-storage-resources 這個 [資源] 頁面。 小組會繼續到的部落格新增詳細資訊的張貼內容和我知道在時間,或甚至是由發行此資料行中的時間,我尋找我的各種問題的答案。 我向前尋找提供一些具體的範例,在未來的資料點資料行中。

Julie Lerman 是一個 Microsoft MVP 在.NET 導師和顧問人居住在丘陵的 Vermont。 若要尋找她的呈現資料存取和其他 Microsoft.NET 主題,在使用者群組和世界各地的會議]。thedatafarm.com/blog 在 Lerman 部落格和是高度 acclaimed 的 「 程式設計 Entity Framework 」 O’Reilly 媒體,2009年書籍作者。請依照她 Twitter.com 上:julielerman.

多虧了要檢閱這份文件的下列的技術專家:Brad Calderand Jai Haridas