

DBにマスタとして持つべき内容とソースコードでConstなリストとして定義すべき内容の線引きについて悩んでいます。  
個人的にはユーザがマスタ管理画面から編集しない場合は、ソースコード上で定義すべきだと思っていますが周囲からの賛同が得られません。

極端な例としては、人事テーブルの性別カラムを0,1のコード値で保持する際に、画面上の表示名「男性」「女性」をDBにマスタで持つか、ソースコードに連想配列
`{0:"男性", 1:"女性"}` で持つか、という問題になります。

ご意見をいただけないでしょうか。

* * *

補足

私自身が「ソースコードで持つべき」と考える理由としては、DBに持った場合、後の運用時にテストなしでマスタにレコードを追加していいかどうか、で迷うことが多いから、となります。

今回の場合ですと、男女にほかに第3の性を加える要件が発生した際に、マスタにレコードを追加するだけでいいのか、もしくは男女をラジオボタンで選択する画面があり、画面レイアウトの修正が必要になるのか、を判断するにはソースコードをすべて把握する必要があります。

ですので判断の基準は正確には、上に書いた「ユーザがマスタ管理画面から編集するか否か」ではなく「レコードの追加・削除・変更について動作が保証されているか」になります。

一方、これまでに聞いた「DB持つべき」とする理由で説得力があったのは、

  * DBを見ただけで"1"が男か女かわかる
  * ソースコードが短くなる
  * 慣例としてDBに持つのが一般的なので、従ったほうが混乱しにくい

などです。


CC BY-SA 4.0
2022-05-18T09:27:28.620
88904
2022-05-21T13:46:48.817
2022-05-21T13:46:48.817
52690
52690
question
database データベース設計 詳細設計
DBにマスタとして持つべき内容とソースコードで定義すべき内容の線引き


> 個人的にはユーザがマスタ管理画面から編集しない場合は、ソースコード上で定義すべきだと思っていますが周囲からの賛同が得られません。

  * 質問された方が「ソースコードで定義」にすべきと考える理由はなんでしょうか？
  * 周囲の方が「ソースコードで定義」することに反対する理由はなんでしょうか？

> ご意見をいただけないでしょうか。

どちらの方式にするかは一概に決められません。どちらもメリット、デメリットがあります。  
システムの要件、特性、ポリシーの何を重視するかによって、どちらが有利かは変わると思います。

* * *

**A) DBのマスタで管理**  
**メリット**

  * 変動があったとき、ソースコードをビルドしなくても済みそうです。

**デメリット**

  * SQLが少し複雑になり、スループットやレスポンスに影響がでそうです。
  * 状況によって表示形が異なる場合が予想され、その場合対応が困難です。

**B) ソースコードで定義**

**メリット**

  * A)の方法よりスループットやレスポンス面で有利
  * 状況によって表示形が異なる場合が予想され、その場合対応がA)に比べて容易です。

**デメリット**

  * 変動があったとき、ソースコードのビルドが必要。
  * ソースコードのあちこちでコーディングされていると修正が困難。  
※表示名を取得する関数を用意するなど、影響を局所化することによりデメリットは軽減できます。


CC BY-SA 4.0
2022-05-19T12:08:14.820
88923
2022-05-19T12:08:14.820
35558
88904
answer


人事テーブルの性別カラムを0,1のコード値でもっているので、  
性別テーブルもあったほうがよいと思います。  
0:男性  
1:女性

理由：  
1.（開発者が性別テーブルとのテーブル結合を知っていれば、）あやまって男性、女性を逆に表示してしまうミスが減る。  
2.後に、「その他」、「不明」などの性別を追加しなければならなくなった場合、変更箇所を特定しやすい。  
3.後に、男性、女性を選択するためのリストボックスが必要となった場合、変更が容易。  
など

性別のコード（0と1）は、なるべくプログラム内に記述しない方針としたほうが、  
柔軟（メンテナンスしやすく、変更に強い）になると思います。


CC BY-SA 4.0
2022-05-20T00:42:27.793
88931
2022-05-20T00:42:27.793
48481
88904
answer