GKE+cloud spannerを使ってプロダクトをリリースしました。
その際に、spannerについていろいろ調べたり、設計をしたので備忘録としてまとめていきます。
spannerがどういったものかは他の記事を参考にしてもらって、この記事では気づきや工夫についてまとめていきます。
UUIDはString(32)
spannerはリレーショナルDBのようなインクリメントするidが存在しません。
そのため、uuidをprimary keyとして使用しますが、その際の方は String(32)
とするのがいいです。
一番最初に設計したときに、 String(64)
としてしまったためにインターリーブする際にずっとこの型を継承しなければならず、見る度に後悔しています。。
インターリーブはやりすぎない
初期の設計では、リレーショナルDBの正規化のように至るところにインターリーブをしていました。
しかし、インターリーブされたテーブルにレコードが集中するとホットスポットが起こりやすくなります。
そのため、子テーブルのデータが無限に増える可能性がある箇所はインターリーブしませんでした。
開発時は本番とは別プロジェクトで作る
spannerの利用を始めた時点では、エミュレータがなかったので本番とは別プロジェクトに自分用のdbを作り運用しています。
プロジェクトでは初期データがなく、困ることが多々あったので、簡単にデータを作れるapiを用意しています。
マイグレーションは別レポジトリ
spannerをサポートしているライブラリが少ないないですが、スター数と使いやすさからこちらを選択しました。
https://github.com/golang-migrate/migrate/tree/master/database/spanner
まとめ
初期のときに気にした点を簡単にまとめました。
今後もあったら追記していこうと思います。