GlobalDBの意義
DBシャーディングの際に、シャーディングしない GlobalDB の必要性を考えてみた。
auto_increment
したい場合。- 例えば
foo
テーブルの id (auto_increment) がbar
baz
など別テーブルの shard_key になるケース。この場合fooテーブル自体はシャーディングできない。分割するとauto_incrementが無理。最悪、それでも分割したい場合はauto_incrementではなくUUIDをidとして振って、そのハッシュ値をshard_keyとするとか。 - ただし本当に
bar
baz
のshard_keyにauto_increment値を使わなきゃいけないのかは別途考えよう。例えば、foo
にshard
カラムみたいなのを作って、INSERT時にランダムな値をそのカラムに突っ込むだけである程度分散可能ではないか?もう少しちゃんとやるならbar_to_shard
のようなシャードマッピングテーブルを作るとか。それで済むのであればfoo
のidに依存しないためfooは分割可能である。
- 例えば
UNIQUE
制約を使いたい場合- 例えばユーザ情報など。
user_id, name, address, e-mail
などのカラムがあった場合、user_id
でもe-mail
でもUNIQUE制約を付けたいとか。そんな時に分割してしまうと、全DBシャードを舐めないといけないので辛い。
- 例えばユーザ情報など。