質問: データベースのID桁数はスカスカになるほど大きな桁を用意する必要があるのでしょうか? こちらの動画で小飼弾さんがマイナンバーのデータベース設計に関して指摘をされていました。 小飼弾の論弾第二弾「システム論~マイナンバーが12桁って作ったやつらはバカじゃないの?」 小飼さんの話では「日本国民の数が9桁に対してマイナンバーが12桁しかない。これでは番号の衝突が簡単に起こりうる。 クレジットカードの番号が16桁あるのはちゃんと意味があるの。スカスカでなきゃいけないの。」 とのことでした。これはなぜでしょうか? 例えばデータベースのユニークキーとしてのIDは連番で割り振っていくものと考えていました。「スカスカでなければ」というのはどういう意味なのでしょうか? 今までユニークなIDとして1100, 2100, 3100,とスカスカに割り振った経験はありません。巨大なデータベースではこのようなことをするのでしょうか? 12桁と9桁の差として1000倍もの数の余裕があるように感じるのですが、ユニークに割り振れない理由はなにになるのでしょうか? 日本国民の人口数ほどの巨大なデータベースではロックがそもそも効かないのでしょうか?
回答: この質問に対する正解は、小飼弾さんの発言の意図を述べる、ってことですかね。国語の試験みたいで懐かしいですね... 昔は名前が識別子として機能していたが現在では識別されるべき範囲が家族内から村、そして国へ広がり、現在名前は識別子とは言えなくなった。 マイナンバーが同じ轍を踏まないためには、設計当初には想定していない事態が発生することも考慮し、十分に余裕をもたせなければならない。 が、2桁では十分に余裕があるとは言えない。 ...というのが該当発言に続く苗字の例え(注:動画リンク)の意図でしょう。 マイナンバー設計でいうと、戦争して他国を併合すれば短期間で管理対象は10倍超増え得ますし、生物には全てナンバーを付与して管理しよう、みたいな有り得そうも無いことが現実にならないとも(確実な未来予知が不可能である以上)弾言できません。 現日本国の出生数だけみて設計するのは間違いだ、じゃあペットや宇宙人まで考慮するのが正解なの?というとまたそれも極論なわけですが、「現時点で使用せねばならない最小桁数+2桁」は余裕があるとは言えない桁数だ、というのは無理筋では無いかな、と。 > > 今までユニークなIDとして1100, 2100, 3100,とスカスカに割り振った経験はありません。巨大なデータベースではこのようなことをするのでしょうか? > > > 小飼弾さんはUUID的なものが念頭にあるのだと思います。対してcoffee manさんが書かれているのは(DBMS用語の)シーケンスですね。 (若干本題から外れますが、)連番で採番しようとすると誰か1人が未使用/使用済み番号を管理せねばならず、スケールの妨げになります。 逆に言うと、スケールさせるためにスカスカを許容せねばならない状況は一般にあります。 シーケンスの代わりにuuidをIDとして使う | Siguniang's Blogより、UUIDのメリット: > > * 外と通信せずに重複しない ID を採番できる > * ID を推測できない。ID を外に公開するようなシステムの場合、特に重要。 > * うっかり別の ID を渡したり、別の ID で処理する確率がシーケンスの場合に比べて低い > > > 2点目, 3点目が小飼弾さんが動画中マイナンバーに対して求めていることと同じであるかと。 (1点目はスケーリング上のメリットですね。)