iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0

由於ScyllaDB不像關聯性資料庫一樣支援join,所以必須在建立table時實作反正規劃。
把必須的欄位放到table內,然後透過Materialized Views來查詢。

Materialized View實際上就是另一個table,資料來源是由原本的table擷取所需的欄位,依據新的query語法需求來選擇partition key和排序。
view的PK必須包括table的PK,並且View的PK只能包括一個非Primary key的欄位。說起來十分饒舌,直接用範例說明。
首先原本的table,id是PK。
https://ithelp.ithome.com.tw/upload/images/20200909/201132200y5mVl9GgG.png
今晚我想來點view,name當PK。
https://ithelp.ithome.com.tw/upload/images/20200909/20113220GqjXCNVJgn.png
結果失敗,因為view的PK必須包括原本的table painting的PK,也就是id。
接著再試試用name,id,time當PK。
https://ithelp.ithome.com.tw/upload/images/20200909/201132209e8N1MX44f.png
結果又錯了。因為name與time在painting裡都不是PK,view只容許放一個非PK的值在view的PK裡頭。
所以正確的做法如下。
https://ithelp.ithome.com.tw/upload/images/20200909/201132209mV36q3R8M.png


Scylla更新資料的順序如下。
https://ithelp.ithome.com.tw/upload/images/20200909/20113220PnKnQjPqCg.png
從圖片可以看出,資料是先寫入table之後才去做update view的動作。
這樣的做法是為了避免同時更新Materialized View與table時服務過載而影響了table的可用性。
View的使用也不會必然依循CL的設定。就算設定是quorum,實際上並不會等到真的有過半的view replica回應才完成。
除此之外,既然view是被認定為另一個table,擁有自己的partition key。那麼在設計時,也必須注意不要造成large partition的情況發生,以免影響效能。


上一篇
Day16 DataModel - TTL
下一篇
Day18 DataModel - Secondary Index
系列文
ScyllaDB實作紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言