2016-10-24 50 views
-2

使用Azure存儲表構建類似博客發佈系統的圖像。 用戶發佈消息並且數據庫記錄用戶的區域,城市和語言。Azure存儲表記錄過濾建議

之後,用戶可以瀏覽所有其他用戶的帖子,並且可以通過區域,城市和語言的任意組合來篩選它們。或者兩者都看不到。

我看到幾個解決方案:

  1. 把每一個消息在8個不同的分區與區域 - 城市 - 語言的組合(優點:在讀快如閃電的點查詢;缺點:每封郵件的8筆上寫)。
  2. 將每條消息放在4個不同的分區中,並使用Region-City和分區掃描功能進行分組掃描,以便通過語言進行篩選(優點:比(1)更少的事務處理;缺點:分區掃描,每條消息4個事務)。
  3. 根據用戶ID(優點:每條消息的單個事務;每個消息都使用慢速表掃描和分區掃描)將每條消息放入分區。

的路上我看到它:

  1. 速讀,慢(也許是昂貴的)寫道。
  2. 平衡讀取/寫入/成本。
  3. 快寫,慢(但便宜)的讀取。

「成本/便宜」我的意思是基於交易(而不是空間)的定價。 而「平衡」我的意思是在這些變種之中。

想到使用索引表,但看不到他們在這裏如何幫助。 所以問題是,也許還有另一種更好的方法?

+0

這真是意見徵集和廣泛 - 沒有正確的答案。您需要進行基準測試,併爲您的特定應用選擇正確的組合。不知道你的意思是「索引表」(也許你指的是額外的存儲表,特定的索引屬性作爲分區/行鍵?)。 –

+0

是的。索引表就像你所描述的。我問是否有任何其他可能的解決方案。 –

回答

0

我決定去(1)的變體。

區別在於我不會存儲區域位置語言的所有組合。相反,我決定只存儲唯一身份:

Table: FiltersByRegion 
---------------------- 
Partition: Region 
Row:  Location.Language 
Prop:  Message 

Table: FiltersByRegionPlace 
--------------------------- 
Partition: Region.Location 
Row:  Language 
Prop:  Message 

Table: FiltersByRegionLanguage 
------------------------------ 
Partition: Region.Language 
Row:  Location 
Prop:  Message 

Table: FiltersByLanguage 
------------------------ 
Partition: Language 
Row:  Region.Location 
Prop:  Message 

因爲事實上我是隻存儲的唯一身份有贏」的每個帖子都會有很多交易。只有那些尚未出現在數據庫中的數據庫。

換句話說,如果來自同一個區域位置語言的帖子很多,過濾表將不會被更新,並且交易將不會被消耗。獨特測試可以使用Redis來加快速度。

過濾現在只是挑選正確的表的問題。

-1

這取決於你的場景和讀/寫模式。你可能想考慮一些方面:

  1. 設計如何查詢記錄。將它們放入具有消息ID作爲實體數據的「區域 - 城市 - 語言」分區可能有助於快速查詢。

  2. 每條消息都可能有一個唯一的消息ID和ID-消息映射保存在其他表中,每當更新消息並且其他表中引用的消息ID保持不變時,每次只需要更新一個表。

  3. 在您的表設計中利用ParitionKey和RowKey並使用兩個鍵查詢實體。例如:「Region-City-Language」作爲分區鍵,「User」作爲行鍵。

  4. 考慮爲查詢場景存儲實體的重複副本。例如,如果您有大量基於用戶和基於語言的查詢,則可以考慮分別使用「user」和「language」作爲關鍵字的兩個表。

另請參閱https://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/以獲取完整指南。