質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.10%

データベース上で独自採番IDに関して

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 1,687

score 17

現在、MongoDBを用いてシステム開発をしています。
MongoDBでは、ドキュメントの挿入時に_idというカラムで、自動的にユニークな英数字を採番されます。
顧客のテーブル(コレクション)にも、このidが振られており、システム内部ではこれを用いて各顧客の特定を行っていますが、
24桁の英数字なので、人間が認識するには長すぎるので、これとは別に人間が用いる用のIDを採番しようと考えました。
用途としては、顧客一覧のページで、顧客IDでの検索を行うなどです。

半角大文字アルファベット3桁+半角数字2桁程度のものを考えています。(例: DCW31)
これは、完全なランダムであり、特別な意味を持たせるものではありません。

これを実現する際に、これだけの桁数では、乱数で作成してもすぐに被りが出てしまうのは想像に難しくありません。
そこで、2つの案を考えました。どっちの案が最適かお教えください。これ以外に何か最適なものがあればご教授ください。

  1. MongoDBのインデックスでユニーク制約を張り、エラーで帰ってきたら、成功するまでリトライ。
  2. あらかじめ、AAA000~ZZZ999までをランダムにシャッフルした配列をデータベースに登録しておき、
    顧客登録の際に、そこから取得し削除する。

どちらでも、ランダムなidが取れるかと思います。
このように、ある程度短い桁数のidというのは需要があるかと思うので、何かしらの最適なやり方があるかと思います。
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yoorwm

    2019/01/08 14:36

    普通に顧客名で検索するようにすればよいのではないでしょうか?

    キャンセル

回答 3

checkベストアンサー

0

半角大文字アルファベット3桁+半角数字2桁程度

まずこれはどうかと思いますけど・・・
仮にAAA00~ZZZ99だとすると26^3*10^2=1,757,600通りですから
想定人数にもよりますが結構なエラー率になると思います。
半角英数字=5桁(大文字小文字含む)にするだけで相当幅が広がります
(9億通り強?)

またユーザーに任意に入力させるためのエイリアスだとすると
ゼロとオー「0oO」、イチとアイとエル「1Il」などは除外したほうがよいかもしれません。

その上でリトライ方式は要素数が少ないときはこれで十分ですが
要素が増えてくると予め用意しておく方式に分がありそうです

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/11 00:06

    ありがとうございました。
    現在、顧客数が5000人程で、増えたところで2,3万人といったところです。
    同姓同名の客の区別のために一応用意しておく程度の意味合いしかありませんが、あまり長いのは面倒くさく、アルファベットは大文字だけが良いとの要望なので、アルファベット大文字3桁+半角数字3桁
    26^3*10^3≒1700万強を用意しておけば、リトライ方式に分がありますかね?

    よろしければ回答いただけると幸いです。
    よろしくお願い致します。

    キャンセル

0

連番を暗号化したものを採用するとか、ライセンスキーのようなもので作るとか。
オートナンバーをランダムユニークな値に変換する
ライセンス キー 作り方 - 好奇心から:シリアル番号はどのように生成されますか? 

個人番号の構成 個人番号とすべき番号の生成要求

自動で採番するなら、[時系列を表すもの]+[連番]+[CD]みたいなもので,、連番は最大値を取得というのがよくあるものだと思いますけど

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

2択なら1の方です。理由としては実装・運用の面から見て
2より手間が少ないためです。

ただDBの制約違反を正常な動作として扱うのは好ましくありません。
意図した制約違反なのか、意図しないものなのか区別がつかず
クリティカルな不具合が埋もれる可能性があります。

なので、IDを生成したらそのIDが存在するかをDBに問い合わせて、
存在すれば再生成を繰り返すのはいかがでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る