主キー設計 文書番号を "カテゴリ + 年度(YYYY) + 6桁数字" とする

最終更新日: 2022年8月15日

実行例

文書カテゴリ

はじめに文書カテゴリを事前に用意します。ここでは "A", "B", "C" の3つの文書カテゴリを作成してみます。

文書カテゴリの新規作成(一覧更新)
文書カテゴリを作成した

文書カテゴリ別採番値

文書カテゴリが登録されるタイミングで「文書カテゴリ別採番値」に(文書カテゴリと年度に対応した)データが作成されるようにしています。値は "1" から開始するとします。

文書カテゴリかつ年度別の採番用テーブル

ここまでで準備完了です。

文書

文書を新規作成します。登録画面では文書番号は表示されていません。

文書の新規作成

文書作成のタイミングで文書番号が用意されます。

文書の作成時に文書番号が決定される

「文書カテゴリ別採番値」を確認します。文書が作成されたカテゴリと年に対応した採番用数値が1つ増えていることがわかります。

採番値の増加を確認する

複数の文書を作成した例です。それぞれの文書番号がルール通りに割り当てられています。

複数の文書を作成した例

設定方法

本サンプルで用意したモデルは「文書カテゴリ」「文書」「文書カテゴリ別採番値」です。

3つのモデル

文書カテゴリ

主キーを「識別子」としています。このため、異なる文書カテゴリが、同じ識別子を使うことはありません。

文書カテゴリ

文書カテゴリ別採番値

文書カテゴリ(の主キーである「識別子」)と「年」の組み合わせによる複合主キーとなります。この組み合わせに対して一つの採番値が管理されます。

文書カテゴリ別採番値

文書

文書の主キー「ID」は、意味をもたない順序値です。文書番号のルールが将来変わっても、主キーに影響はありません。文書番号は人間のために用意された管理番号です。

文書

IDとコードを分離する

この例では「(意味のない)ID」を主キーとしています。一方、人間が意味を込めたい管理番号をコードとして区別しています。

IDとコードを分離することで、設計時には想定していなかったコードの重複が許容されます。またコード体系ルールが変更された場合でも既存の文書に影響はありません。もしコードを主キーとした場合、コード体系の変更により過去データの主キーを新体系でつくりなおす「洗い替え」という作業が発生します。

このようにシステム内部で利用するIDはできるだけ意味を含めないようにすることが主キー設計のポイントです。

文書カテゴリ作成時、対応する「文書カテゴリ別採番値」を同時に作成する

文書カテゴリ登録のタイミングで、文書カテゴリ別採番値のレコードを登録します。文書カテゴリの主キー値が、文書カテゴリ別採番値の主キーの一部になっています。

文書カテゴリのタイミングで動作するスクリプト

ところで文書カテゴリ別採番値の他の項目(年、現在の値)はどこで設定するのでしょうか。

文書カテゴリ別採番値の他の項目の値

文書カテゴリ別採番値を登録するタイミングの初期値を設定するタイミングで「年」と「現在の値」をセットするようにしています。

文書カテゴリ別採番値の初期値の設定

文書の作成

初期値

文書作成時の初期値として「日付」を設定します。

文書作成の初期値設定

文書番号の設定

文書登録のタイミングで、ルールに準拠した「文書番号」を生成します。

  1. 文書モデルに含まれる「文書カテゴリ」と「日付」のペアを主キーとして「文書カテゴリ別採番値」が持つ現在の採番数値を得ます。
  2. 文書モデルの「文書カテゴリ」は "A", "B",... という値です。この値と、年を結合し、さらに上で求めた最大値を LPAD 関数をつかって "0" 詰め 6 桁の文字列の組み合わせとします。
  3. 「文書カテゴリ別採番値」の採番値を1つ増やします。
文書番号の割り当てと採番値の増加

演習

1. 年度への切り替え

上の例では「年」としていました。そのため12月から1月に切り替わるタイミングで、採番する値は1に戻ります。これを「年度」(4月から3月まで)とするにはどうすればいいでしょうか。

[回答...]

2. 年が切り替わったタイミングで文書カテゴリ別採番値レコードを自動的に増やす

上の例は年(または年度)切り替えの前に手動で文書カテゴリ別採番値レコードを増やしておく必要がありました。これを自動で行うには、どうすればいいでしょうか。

[回答...]

インストール

上記 1,2 を含むリポジトリを「アドオンギャラリー > 文書番号設定デモ」から入手できます。

アドオンギャラリー > 文書番号設定デモ