質問: これまでDBのテーブル設計をしていていつも迷うことがあります。 それは「名称」をトランザクション系のテーブルに持つべきかということです。 一般的には名称はコード化してマスタ系のテーブルで一元管理するべきというのが正規化という意味では良いと思うのですが、例えば会社名を会社マスタに持っていて、ある時その会社の名前が変わったという場合に、会社マスタに登録されている名称を変更してしまうと、過去のその会社との取引情報を表示したときに、新しい会社名で表示されることになってしまいます。本来はその時点での会社名で表示するべきだと思います。このようなケースへの対応として、会社コード、会社名の両方をトランザクション系のテーブルに持たせているテーブル設計を見かけますが、これは正規化ができていないし、コード化している意味もないのではという気がしてしまいます。 別のアイデアとして、名称が変わったら別会社扱いにして新たなレコードをマスタに追加するというのもあり得ますが、ユーザには同じ会社であるように見せる必要が出てきたりして、処理が煩雑になる気がします。 何がベストなソリューションなのかいつも悩むのですが、皆様はどのように解決されておりますでしょうか。
回答: > > 本来はその時点での会社名で表示するべきだと思います > > > 「べき」かどうかはビジネスの要求事項によって変わります。 * 現時点の情報しか参照しない * 名前だけがその時点のものであればよい * その時点の複数の情報が必要 * 情報だけでなくその時点のマスタ情報へのリレーションを含めて正確に保存されていないといけない 「ベストなソリューション」がなにかも、要求事項次第です。それをまず考えないと、「ベストなソリューション」は実は要求事項を満たしてないとか、「ベストなソリューション」は要求事項に対して無意味に複雑で遅い処理が必要、とかそういうことになります。