DB で KVS っぽいやつを作ろうとしたときの失敗メモ
なにも考えずにものすごく筋の悪いテーブル設計をしてしまったので反省メモ
要件
ざっとこんな感じ.
- フォーマットが異なる数種類の JSON を 1 つのテーブルに保存する
- DB から取り出したときにどのフォーマットであるか判別できる
- すべてのフォーマットが常に存在するわけではない
- フォーマットの種類は増える可能性がある
- JSON は定期的に更新される
要は,DB のテーブルでごく小規模な KVS を実現したいというもの.
最初につくったテーブル
JSON のフォーマットごとにカラムをつくり,それぞれ特定のフォーマットの JSON が格納されるようにした. 存在するレコードは常に 1 つ.
create table json_cache
(
id bigint unsigned not null auto_increment,
json1 json,
json2 json,
json3 json,
created_at datetime,
updated_at datetime,
primary key (id)
)
この設計はとても筋が悪くて,
- JSON のフォーマットの種類が増えたとき,カラムを増やす必要がある
- 特定のフォーマットの JSON を取得するとき,不要な JSON まで首藤されてしまう.DB でやりとりされるデータ量が増える
updated_at
がどの JSON を更新したときのものか判別できない
つくりなおしたテーブル
type
で JSON を識別できるようにした.JSON の種類と同じだけレコードが存在する.
id
いらなかったかな.
create table json_cache
(
id bigint unsigned not null auto_increment,
type varchar(255),
json json,
created_at datetime,
updated_at datetime,
primary key (id)
)
結局 Redis を使うことにしてこのテーブルを使ってない