🤕

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)
)

emoji-memo 結局 Redis を使うことにしてこのテーブルを使ってない