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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Q&A

解決済

3回答

1622閲覧

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

untan.r

総合スコア17

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

0グッド

1クリップ

投稿2019/01/08 05:24

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

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

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

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

顧客登録の際に、そこから取得し削除する。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoorwm

2019/01/08 05:36

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

回答3

0

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

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

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

投稿2019/01/08 05:44

take_3306

総合スコア242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

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

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

投稿2019/01/08 05:42

yambejp

総合スコア114779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

untan.r

2019/01/10 15:06

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

0

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

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

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

投稿2019/01/08 05:37

編集2019/01/08 05:50
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問