#前提
毎日スクレイピングしたデータをDynamoDBに格納しているので、日々一定量のデータが増加している。
主にデータは98%がその日に利用され、1か月以降の利用率は1%未満。
つまり、新しいデータほど利用頻度が高く価値があり古いデータにかかるコストを抑えたい。
Time Based Partition Tablesパターンを利用
(AWS Summit 2014で安川さんが話していたテーブルパターン)
#テーブル名
まずスクレイピデータを蓄積するテーブルを作成します。
例
2017-07-Article
テーブル名に年月を入れ、スクレイピングしたデータはその月のテーブルに格納します。
テーブルは毎月作成し、古く利用率の低いテーブルはスループットを抑えたり、アーカイブしてS3などに書き出しdrop tableで削除し、費用を抑えることができます。
awsのdynamodbはテーブルをグループでまとめて管理できないので、名前によって整理をつけます。
使用できるプレフィックスは.
, _
, -
#Primary key
- Primary key:
- Hash key: articleId
- Range key: timeStamp
articleId | timeStamp | Title |
---|---|---|
xxxzzzz | 1501165697 | xxxx |
yyydssd | 1501165693 | yyyy |
zzfafdf | 1501165297 | zzzz |
sasgddd | 1501145697 | aBBf |
gewgggg | 1501165657 | fdsa |
etdgdsd | 1501165677 | drag |
Range keyはNumber型にしておくことで、データ取得時に時刻順にソート可能です。
キー条件式は
a = b - 属性 a が値 b と等しい場合、true
a < b - a が b より小さい場合、true
a <= b - a が b 以下である場合、true
a > b - a が b より大きい場合、true
a >= b - a が b 以上である場合、true
a BETWEEN b AND c - a が b 以上で、c 以下である場合、true。
次の関数もサポートされます。
begins_with (a, substr) - 属性の値 a が特定のサブ文字列から始まる場合、true。
参考
http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Query.html#QueryAndScan.Query