QA@IT

汎用的にデータを管理するテーブル設計について

5196 PV

複数社の人事情報を管理する仕組みを検討中なのですが、
DBのテーブルをどのような構成にすべきか迷っています。

  • データベース:Oracle11gR2 Enterprise Edition
  • 開発言語: Java 7
  • OS: Windows 2012 R2
  • 管理する情報は会社毎によって異なる

    (例)
    A社は家族の情報を管理するが、B, C社は管理する。
    B社は家族の生年月日を管理するが、C社は管理しない
    など

  • 管理項目の追加などのメンテナンスは業務の担当者が行えるようにしたい

    (例)
    家族の情報として、住所を追加したい、
    役職の情報を新たに管理したい、など

  • 都度、プログラム修正はNG

以下のような案を考えたのですが、いずれもしっくりきません。

(案1) あらかじめ余裕を持たせたカラム数のテーブルを用意しておく

  • 管理テーブルマスタ(管理する情報を保持する)

TableId , TableName
1 , 家族
2 , 住所

  • 項目マスタテーブル(管理テーブル毎の項目マスタ)

TableId, ColumnName1, ColumnName2, ColumnName3
1 , 氏名, 性別, 生年月日

  • 情報テーブル

社員Id, TableId, Value1, Value2, Value3
1, 1, IT 太郎, 男, 1980/01/01

(案2) 兎に角正規化。一つ一つの項目をレコード単位で管理する。

  • 管理テーブルマスタ

TableId , TableName
1 , 家族
2 , 住所

  • 項目マスタテーブル

TableId, ColumnId, SortOrderNo , ColumnName, DataType
1 , 1 , 氏名, String
1 , 2 , 性別, String
1 , 3 , 生年月日, Date

  • 情報テーブル

社員Id, TableId, ColumnId, StringValue(Varchar2(4000)), NumberValue(Number), DateValue(Date)
1, 1, 1, IT 太郎, (null), (null)
1, 1, 2, 男, (null), (null)
1, 1, 3, (null), (null), 1980/01/01
※もしくはデータは全てVarChar2で保持し、プログラムでキャスト処理する

(案3)都度、情報を保持するテーブルを作成する

  • 管理テーブルマスタ(管理する情報を保持する)

TableId , TableName
1 , 家族
2 , 住所

  • 項目マスタテーブル

TableId, ColumnId, SortOrderNo , ColumnName, DataType, Size
1 , 1 , 氏名, String, 100
1 , 2 , 性別, String, 1
1 , 3 , 生年月日, Date, (null)

  • 情報管理テーブル (上記の管理テーブル、項目マスタテーブルが変更される度に、テーブルを生成)

社員ID, 氏名(Varchar2(100)), 性別(Varchar2(1)), 生年月日(Date)
1, IT 太郎, 男, 1980/01/01

皆さんならこのような場合、どのような方法を取られますか?

回答

実際に使用するかは別として一般的な項目は設けておいて

案3の内容で拡張項目を扱えばよいのではないでしょうか。

編集 履歴 (0)
  • ありがとうございます。
    やはりそれがいいでしょうか。
    検討してみます。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。