Professional Data Engineer(Google Cloud) 無料問題 6 / 10 ・ 分野3: データの保存
Bigtable で計測器のデータを持つテーブルの行キーを、meter#a7c3e912#20260310 のように「計測器の種類#計測器の ID#記録した日」の順で作る。Schema design best practices のページの記述に合うものはどれか。
- 計測器の種類と日付を指定すれば、ID を指定しなくても、その組み合わせの行を1回の読み取り要求の行範囲として取り出せる
- 計測器の ID と日付を指定すれば、種類を指定しなくても、その組み合わせの行を1回の読み取り要求の行範囲として取り出せる
- 計測器の種類と ID を指定すれば、日付を指定しなくても、その組み合わせの行を1回の読み取り要求の行範囲として取り出せる
- 日付の部分をゼロで埋めずに書いても、Bigtable は数値の順に並べるので、日付の範囲の読み取りには響かない
正解と解説を見る
正解: C
正解の理由
Row keys の節は、Bigtable で最も効率のよい読み取りは、行キー・行キーの接頭辞・開始と終了の行キーで決まる行の範囲のどれかで取り出すものだと書く。ほかの形のクエリはテーブル全体の走査になり、はるかに効率が悪い。区切り記号で分けた行キーでは、先頭の区切り(またはつながった先頭の区切りの組)が接頭辞になる。ページの例(端末の種類#端末の ID#記録した日)のとおり、「種類#ID#日」の形なら、種類だけ、または種類と ID の組み合わせを、1回の要求の行範囲として取り出せる。
違う選択肢
「計測器の種類と日付を指定すれば、ID を指定しなくても、その組み合わせの行を1回の読み取り要求の行範囲として取り出せる」… 種類は先頭の区切りなので接頭辞として範囲を読めるが、日付は3番目の区切り、つまり行キーの末尾(接尾辞)にある。途中の ID を飛ばして日付で範囲を決めることはできない。ページは、先頭の区切りを決めずに、末尾や途中の区切りだけを元に行の範囲を要求することはできず、日付の値で探すにはフィルタ付きの読み取りが要ると書く。
「日付の部分をゼロで埋めずに書いても、Bigtable は数値の順に並べるので、日付の範囲の読み取りには響かない」… ページは、Bigtable はデータを辞書順(lexicographically)に保存すると書き、辞書順では 3 は 20 より大きいが、20 は 03 より大きい例を挙げる。数値の順に並べたい整数は先頭をゼロで埋めるよう勧め、範囲で読むタイムスタンプでは特に大事だとする。ゼロで埋めないと、範囲の読み取りで日付の順が崩れる。
「計測器の ID と日付を指定すれば、種類を指定しなくても、その組み合わせの行を1回の読み取り要求の行範囲として取り出せる」… ID は途中の区切り、日付は末尾の区切りで、どちらも行キーの接頭辞にならない。先頭の区切りを決めずに、途中や末尾の区切りだけを元に行の範囲を要求することはできないので、種類を指定せずに読むと、テーブル全体を走査するフィルタ付きの読み取りになる。
設計の勘所
ページは、行キーは取り出すときのクエリに合わせて設計し、共通の値で始めて細かい値で終える形がよいことが多いと書く。行キーを正しく選んでおけば、あとで痛みを伴うデータの移行を避けられる。日付で全計測器をまとめて読むことが多いなら、その読み方に合わせて行キーの組み方を考え直す。
Professional Data Engineer(Google Cloud)の演習アプリ(無料10問・全問は解錠で)へ