GlobalDBの意義

DBシャーディングの際に、シャーディングしない GlobalDB の必要性を考えてみた。

  1. 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値を使わなきゃいけないのかは別途考えよう。例えば、fooshard カラムみたいなのを作って、INSERT時にランダムな値をそのカラムに突っ込むだけである程度分散可能ではないか?もう少しちゃんとやるならbar_to_shardのようなシャードマッピングテーブルを作るとか。それで済むのであればfooのidに依存しないためfooは分割可能である。
  2. UNIQUE 制約を使いたい場合

    • 例えばユーザ情報など。user_id, name, address, e-mail などのカラムがあった場合、user_idでもe-mailでもUNIQUE制約を付けたいとか。そんな時に分割してしまうと、全DBシャードを舐めないといけないので辛い。