永続的で堅牢な一意のIDを採番したい

 

永続的で堅牢な一意のIDを採番したいです。

 

現在はレコード番号を一意のIDとして

関連レコード一覧などのアプリ間のひもづけとして

利用していますが、バックアップからリストア(※)した場合に

レコード番号が変わってしまうことがわかり

別の方法を探しています。

 

※GusukuまたはkBuckupの利用を検討しています

 

画面以外に外部からREST API経由で一括登録がありますので

「自動採番プラグイン」や、同等ロジックのJavascriptは採用できません。

 

外部サーバーに採番サービスを立てて利用する方法を

思いついていますが、もっとシンプルな方法がございましたら

ご教授いただきたいです。

 

よろしくお願いします。

 

 

採番サービスのために、外部にサーバをたてるなら、採番管理用アプリを作成し、採番する方法があります。

 

「自動採番プラグイン」ですが、一番新しいレコード番号から採番フィールドを更新するプラグインになっています。

どの方法を使っても、結局は画面から保存時の採番処理と、外部から保存時の採番処理が必要になってきます。

 

「自動採番プラグイン」を使い、外部から保存時も同様の処理を加える方法もあります。

メントありがとうございます。

 

 私が書いた「外部サーバーに採番サービスを立てて利用する方法」について、補足します。

外部サーバー自体は既存のサーバーを利用します。そこにPostgreSQLを入れて、

シーケンスオブジェクトから番号を取得するWEB-APIを作成しようと思っています。(今のところ)

 

「自動採番プラグイン」ですが、レコード番号の最大値+1を採番しているかと思います。

その場合、同時アクセスで同じ番号が振られる心配もあると思っています。

「値の重複を禁止する」設定をすることで重複したIDが登録されることは

避けられると思いますが、最初から一意性が保証されたIDを取得できるのが希望です。

だとしたら、現在のミリ秒を取得して、それをIDにしてしまうというのはどうでしょう。

ミリ秒でも重複を恐れるなら、長くはなりますが(ここ)のコードを利用して、ミリ秒+乱数するもありだと思いますが、これも絶対の保証はできません。

 

絶対の保証がほしいなら、レコード保存後、PUTしてIDフィールドにレコード番号を加えてしまうという方法もありかもしれません。

IDフィールドの元の文字列によっては、バックアップ後レコード番号で被る可能性があるので、ミリ秒+レコード番号が良いでしょうか。

 

すっきりした解決法が提示できなくて、申し訳ありませんが案はこれくらいになります。

 

コメントありがとうございます。

 

数値以外の文字も入りますが、UUIDというアイディアを同僚にもらったので投稿します。

https://ja.wikipedia.org/wiki/UUID

 

Gistからの引用となりますが、Javascriptのサンプルコードを貼っておきます。

https://gist.github.com/jcxplorer/823878

function uuid() {
  var uuid = "", i, random;
  for (i = 0; i < 32; i++) {
    random = Math.random() * 16 | 0;

    if (i == 8 || i == 12 || i == 16 || i == 20) {
      uuid += "-"
    }
    uuid += (i == 12 ? 4 : (i == 16 ? (random & 3 | 8) : random)).toString(16);
  }
  return uuid;
}