枯れた技術の水平思考

世の中わからないことだらけだ.少し確かなことは検証をしたことだけ

RDBとKVSにおけるキー設計の違いについて

背景

KVS のデータの設計を考えているときに,UUID の他にいい感じに分散できる ID がないかという話になった. RDB では ULID がソート可能なため,局所性を高められいいという話をした. その際に KVS(BigTable)では局所性を高めたほうがいいのかと聞かれ, ホットスポットを避けるために局所性を高めることは避けたほうがいいという話をした.

この違いはなにかを文章として残す.

なぜか

RDB では key を用いて一意にデータを特定し,読み書きするという用途ではないため, 参照されやすいデータをメモリ上にもっておくことで DISK からの読み出しを避けることができ,高速化する

また RDB では,あるテーブルの時間的に前後しているデータをまとまって読み書きするユースケースが多く, この場合に時間的局所性がある key 設計であるとシーケンシャルにデータを読み取れるため有利である.

一方で BigTable などの KVS は,読み出したいデータの key は事前にわかっている用途で利用されることが多く, 時間を基準に前後しているデータの範囲読み書きはあまり行われない

このようなデータアクセスの特徴があり,最適化するための方法が RDB と KVS で異なるためアプローチが異なる

違い

RDB では時間的局所性があるデータ構造が,あるテーブルの最新のデータの読み書きという主要ケースで有利 KVS では時間的局所性が高いデータは複数のノードに分散させ,KVS 全体で安定した性能を出すことが重要