質問: お世話になります。 データベース設計でスーパータイプ、サブタイプというのがありますが、 サブタイプ固有のフィールドの中で一部のテーブルで共通化できるものがある場合、これはスーパータイプに含めるべきでしょうか。 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/a8eea54f699521a15fa25fdb6a21fef3.png) 上記は社員テーブルをスーパータイプとして、正社員、アルバイト、契約社員という区分毎でサブタイプを切り出しています。ここで、アルバイトと、契約社員の中で、「hourly_salary」と「working_hours」が共通のフィールドとして、切り出せるのでスーパータイプの「employee」テーブルに含めるというのはありでしょうか。 このような例の場合は、employeeテーブルとpart_time,afreementテーブル間に中間テーブルを入れるという作る方もあるかもしれませんが、これがテーブルの数が増えて、フィールドの数も増えた場合はどうでしょうか。 一部で共通化できるからスーパータイプテーブルに入れるとnullを許容することにもなるので、 問題ではないかと思っています。 このような場合のDB設計について皆様のご意見をお聞かせください。 ※上記図はあくまで例として出しているだけなので、スーパータイプ、サブタイプと分けた場合で一部で共通化出来るフィールドをどうするかという質問に対してのご回答をお願いいたします。
回答: 私の意見としては、一部共通できるからといってスーパータイプにフィールドを持たすような設計にはしません。 それを許すなら、最初から上記の4つのテーブルは1つでいいじゃないという設計思想になってしまいます。 ボトムアップの設計をすると共通化したいと思うのは理解できます。 共通化したいから親側のテーブルに持たそうという考え方はしないです。 今回の場合、給与の計算方法、月給と時給とで分けるように設計すると思います。 ※正社員テーブル、契約社員・アルバイトテーブルの2つ [追記] > > やはり共通フィールドに持たせるようなやり方はしないですかね。 > > できれば、具体的にどのような問題がおきるかなど教えていただけますでしょうか。 > > > 問題というほどのものではないですが、 > > 一部で共通化できるからスーパータイプテーブルに入れるとnullを許容することにもなるので、 > > 問題ではないかと思っています > > > の部分かなと思っています。nullを許容すること自体は気にしませんが、いわゆる社員区分によって 見るカラムを変更するのが面倒です。(caseでカバーできますが) それよりも、テーブル単位で見るカラムが同じほうが、私は好みです。