質問: 現在、MongoDBを用いてシステム開発をしています。 MongoDBでは、ドキュメントの挿入時に_idというカラムで、自動的にユニークな英数字を採番されます。 顧客のテーブル(コレクション)にも、このidが振られており、システム内部ではこれを用いて各顧客の特定を行っていますが、 24桁の英数字なので、人間が認識するには長すぎるので、これとは別に人間が用いる用のIDを採番しようと考えました。 用途としては、顧客一覧のページで、顧客IDでの検索を行うなどです。 半角大文字アルファベット3桁+半角数字2桁程度のものを考えています。(例: DCW31) これは、完全なランダムであり、特別な意味を持たせるものではありません。 これを実現する際に、これだけの桁数では、乱数で作成してもすぐに被りが出てしまうのは想像に難しくありません。 そこで、2つの案を考えました。どっちの案が最適かお教えください。これ以外に何か最適なものがあればご教授ください。 1. MongoDBのインデックスでユニーク制約を張り、エラーで帰ってきたら、成功するまでリトライ。 2. あらかじめ、AAA000~ZZZ999までをランダムにシャッフルした配列をデータベースに登録しておき、 顧客登録の際に、そこから取得し削除する。 どちらでも、ランダムなidが取れるかと思います。 このように、ある程度短い桁数のidというのは需要があるかと思うので、何かしらの最適なやり方があるかと思います。 よろしくお願いいたします。
回答: 2択なら1の方です。理由としては実装・運用の面から見て 2より手間が少ないためです。 ただDBの制約違反を正常な動作として扱うのは好ましくありません。 意図した制約違反なのか、意図しないものなのか区別がつかず クリティカルな不具合が埋もれる可能性があります。 なので、IDを生成したらそのIDが存在するかをDBに問い合わせて、 存在すれば再生成を繰り返すのはいかがでしょうか。