• ベストアンサー

データベース設計、同一マスターへの外部キーについて

例えば社員マスターテーブルがあり、稟議書のテーブルがあったとします。 稟議書のレコードには、作成者、指示者、承認者など、 社員を入れるべき項目がいくつもあり、 データ上はIDとしたいですが、表示は氏名を利用したいと思っています。 こういった場合はどうテーブル設計したらいいでしょうか、 または皆様はどういうテーブル設計にしているでしょうか。 私は以下の2案しか思いつきませんでしたが、 もっとスマートな方法、または実際にどうしている、 どうすべきなどありましたら、ご教授、ご意見ください。 よろしくお願いいたします。 案a.稟議書テーブルに各項目の社員IDフィールドを作り、 表示時は、必要数分の社員マスターテーブルを別名で結合する →リレーションとしてあまり正しくない? 処理が重くなる? 案b.稟議書テーブルに各項目分の社員IDフィールドと 社員氏名フィールドも作る →冗長である? 整合性が問題?

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

案a.で良いのではないかと思います。 >→リレーションとしてあまり正しくない? 処理が重くなる? 別に普通です。フィールドが幾つあるか知りませんが、100や200で 重くなるようなDBシステムでは使い物にならないでしょう。 案b.は稟議時のデータの正確性を異常に気にする場合には必要です。 例えば、稟議作成者が、結婚などで姓名が変更されたとします。 稟議データ自体は変更しないのに、社員マスタ更新前後で出力内容が 変化しますね。こういうのを許すか許さないかで、氏名フィールドの 要否が決まります。

coffret
質問者

お礼

なるべく複雑な結合をしないように シンプルなテーブル設計にした方がよいと言われていたこともあり、 また書籍やサイトなどで調べようとしても、 似たような事例やその設計に対する解説が見つけられず、 実際にはどう設計すべきなんだろうと悩んでおりました。 そういった意味で、普通と言っていただけ安心いたしました。 また、氏名フィールドの要否についても参考になりました。 ご回答ありがとうございました。

その他の回答 (1)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

検索効率を重視したとしても、案bはさすがによろしくないと思います。フローが固まっているならば案aの方式ですかね。 他の方法としては別テーブルを作って、承認履歴を縦持ちさせる方法があります。 承認履歴テーブル(稟議書番号、ワークフロー番号、社員ID、日時、承認者コメント) で、稟議書番号、ワークフロー番号、社員IDに外部制約を掛けます。 一覧表のビューを作成する上では1の方式と比べてパフォーマンスがいいということはありませんが、 稟議書システムは性質的に後で承認フローが伸びることもあるので、しっかり要件が固められない場合や汎用的に作りたい場合は、 データ件数やDBMSの仕様(ビューにインデックスが張れるかなど)を検討した上で、この方式でやるかもしれません。

coffret
質問者

お礼

bの方がイレギュラーで、基本的にはaが正しいのですね。 他の方法についても、どう設計すべきかの判断材料や参考として、 大変有益な情報でした。 今回は項目(フロー)がほぼ固まっていることと、 おっしゃるとおりビュー作成でa案と変わらない処理であろうことから、 とりあえずa案でいこうかと思います。 ご回答ありがとうございました。

関連するQ&A