質問: データベース設計について質問です。 現在、Webシステムの基本設計段階で 「汎用区分マスタ」というテーブルを設計しています。 ・多言語対応するために、一つの区分値に対して 複数の言語での名称を登録する必要がある ・今回は日本語対応のみ ・現在は「マスタを更新しない、参照のみの区分」しか存在しない ・将来的にはカスタマイズでマスタメンテ画面を追加し、 区分や区分値が更新対象になる可能性がある という前提です。 開発環境は 言語:Java,JavaScript DB:SQL Server です。 過去に他の案件で使用していた同じ役割のテーブルを参考に 現在は下記のようなテーブル定義になっています。 分類コード varchar(30) PK 区分値 varchar(30) PK 言語コード varchar(3) PK 表示名 nvarchar(100) NOT NULL 表示順 smallint NOT NULL 備考 nvarchar(200) 予備項目1 nvarchar(200) 予備項目2 nvarchar(200) 予備項目3 nvarchar(200) 削除フラグ bit 登録日時 datetime2 登録者ID nvarchar(20) 登録APP nvarchar(50) 更新日時 datetime2 更新者ID nvarchar(20) 更新APP nvarchar(50) 例えば、課税区分と国なら(一部抜粋) 分類コード 区分値 言語コード 表示名 表示順 KAZEI_KBN 1 JPN 内税 1 KAZEI_KBN 2 JPN 外税 2 KAZEI_KBN 3 JPN 非課税 3 KUNI_KBN AD JPN アンドラ 16 KUNI_KBN AE JPN アラブ首長国連邦 8 KUNI_KBN AF JPN アフガニスタン 5 ・ ・ ・ といったデータを格納します。 自分で調べてみたのですが ■メリット ・マスタメンテ画面が1つで済む ・分類コードの条件を変更すれば複数の機能や画面で表示名の取得SQLを使用できる ・個別のマスタを持つよりテーブル数が少なくなる ・新しい分類が増えてもテーブルを増やさなくて良い ■デメリット ・データの件数が多くなり、検索コストが上がる ・テーブルのレコードを見ないとどんな値を保持しているかわからない ・余裕を持って桁数の大きい項目や、予備カラムを用意している分データ容量が増える というような内容しかわからず、個人的な感覚としては 「テーブルの数が増えても、個別のマスタを準備した方が良いのでは?」 と思うのですが、上手く説明できません。 なんとなく、個別マスタを持った方が良い条件は ・複数の画面でドロップダウンリストに表示する ・区分と名称以外の項目(上位分類など)がある ・専用の区分値更新処理(他システムからの連携、マスタメンテ画面など)がある ・区分値の有効期限がある(キーに期間の情報を持たせる) かな?と思っているのですが ・それ以外の「主に区分値と名称の表示しか使用しない区分」は 全て汎用区分マスタにつっこんでしまえば良いの? ・将来マスタメンテ画面が出来た場合を考えると できるだけ汎用区分マスタを使用した方が良いの? ・予備カラムって無駄じゃないの? どんなデータが入るかわからないから桁数を 大きめに持っておくのってどうなの? といった疑問が湧いてきます。 私にとって、初めてのデータベース設計で困っています。 区分値のマスタテーブルはどのように設計すればよいのでしょうか? 解説、経験談(設計・開発)もあればお願い致します。 このようなテーブル設計について参考になるサイトや書籍などがあれば 教えてください。 宜しくお願い致します。
回答: 「汎用区分」の扱いについては、 Entity-Attribute-Value と呼ばれるSQLアンチパターンに該当するかと思います。 以下のページに同様の質問をされている方がいらっしゃる様に思いました。 「メタデータテーブル」という設計 / 考え方について、ご意見をお聞きしたいです