これまでDBのテーブル設計をしていていつも迷うことがあります。  
それは「名称」をトランザクション系のテーブルに持つべきかということです。  
一般的には名称はコード化してマスタ系のテーブルで一元管理するべきというのが正規化という意味では良いと思うのですが、例えば会社名を会社マスタに持っていて、ある時その会社の名前が変わったという場合に、会社マスタに登録されている名称を変更してしまうと、過去のその会社との取引情報を表示したときに、新しい会社名で表示されることになってしまいます。本来はその時点での会社名で表示するべきだと思います。このようなケースへの対応として、会社コード、会社名の両方をトランザクション系のテーブルに持たせているテーブル設計を見かけますが、これは正規化ができていないし、コード化している意味もないのではという気がしてしまいます。  
別のアイデアとして、名称が変わったら別会社扱いにして新たなレコードをマスタに追加するというのもあり得ますが、ユーザには同じ会社であるように見せる必要が出てきたりして、処理が煩雑になる気がします。  
何がベストなソリューションなのかいつも悩むのですが、皆様はどのように解決されておりますでしょうか。
CC BY-SA 4.0
2021-04-29T04:04:17.940
75568
2021-04-30T05:04:50.500
45058
question
データベース設計
テーブルの正規化について
「会社」マスタの列を「会社コード」と「会社名」と「版数」とすれば「会社コード」を変えなくても会社名の変更にたえられると思います。  
記録としての意味をもつテーブルならば、その時点の「会社名」と考え、その「会社名」は一元管理の対象とは思えません。  
現社名も必要なら「会社コード」を持つことにより、いつでも最新の「会社名」が得られると思います。
CC BY-SA 4.0
2021-04-29T07:47:03.243
75574
2021-04-29T07:47:03.243
35558
75568
answer
> 本来はその時点での会社名で表示するべきだと思います

「べき」かどうかはビジネスの要求事項によって変わります。

  * 現時点の情報しか参照しない
  * 名前だけがその時点のものであればよい
  * その時点の複数の情報が必要
  * 情報だけでなくその時点のマスタ情報へのリレーションを含めて正確に保存されていないといけない

「ベストなソリューション」がなにかも、要求事項次第です。それをまず考えないと、「ベストなソリューション」は実は要求事項を満たしてないとか、「ベストなソリューション」は要求事項に対して無意味に複雑で遅い処理が必要、とかそういうことになります。
CC BY-SA 4.0
2021-04-30T05:04:50.500
75586
2021-04-30T05:04:50.500
5793
75568
answer