質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

2回答

863閲覧

スーパータイプ、サブタイプの一部のテーブルで共通化しているフィールドがあるとき

annderber

総合スコア98

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2018/08/06 08:14

編集2018/08/06 08:22

お世話になります。

データベース設計でスーパータイプ、サブタイプというのがありますが、
サブタイプ固有のフィールドの中で一部のテーブルで共通化できるものがある場合、これはスーパータイプに含めるべきでしょうか。

イメージ説明

上記は社員テーブルをスーパータイプとして、正社員、アルバイト、契約社員という区分毎でサブタイプを切り出しています。ここで、アルバイトと、契約社員の中で、「hourly_salary」と「working_hours」が共通のフィールドとして、切り出せるのでスーパータイプの「employee」テーブルに含めるというのはありでしょうか。

このような例の場合は、employeeテーブルとpart_time,afreementテーブル間に中間テーブルを入れるという作る方もあるかもしれませんが、これがテーブルの数が増えて、フィールドの数も増えた場合はどうでしょうか。

一部で共通化できるからスーパータイプテーブルに入れるとnullを許容することにもなるので、
問題ではないかと思っています。

このような場合のDB設計について皆様のご意見をお聞かせください。

※上記図はあくまで例として出しているだけなので、スーパータイプ、サブタイプと分けた場合で一部で共通化出来るフィールドをどうするかという質問に対してのご回答をお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

私の意見としては、一部共通できるからといってスーパータイプにフィールドを持たすような設計にはしません。

それを許すなら、最初から上記の4つのテーブルは1つでいいじゃないという設計思想になってしまいます。

ボトムアップの設計をすると共通化したいと思うのは理解できます。
共通化したいから親側のテーブルに持たそうという考え方はしないです。

今回の場合、給与の計算方法、月給と時給とで分けるように設計すると思います。
※正社員テーブル、契約社員・アルバイトテーブルの2つ

[追記]

やはり共通フィールドに持たせるようなやり方はしないですかね。

できれば、具体的にどのような問題がおきるかなど教えていただけますでしょうか。

問題というほどのものではないですが、

一部で共通化できるからスーパータイプテーブルに入れるとnullを許容することにもなるので、

問題ではないかと思っています

の部分かなと思っています。nullを許容すること自体は気にしませんが、いわゆる社員区分によって
見るカラムを変更するのが面倒です。(caseでカバーできますが)

それよりも、テーブル単位で見るカラムが同じほうが、私は好みです。

投稿2018/08/07 01:57

編集2018/08/07 03:51
momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

annderber

2018/08/07 03:00

コメントありがとうございます。 やはり共通フィールドに持たせるようなやり方はしないですかね。 できれば、具体的にどのような問題がおきるかなど教えていただけますでしょうか。
guest

0

私なら「社員の給料マスタ(employee_salary」として、社員テーブルとは切り離します。

employee_id // 社員ID monthly_salary // 月給(null 可) hourly_salary // 時給(null 可) start_date // 適用開始日 end_date // 適用終了日

まあ適用開始・終了までは不要とは思いますが、一応入れときますかね。
月給・時給以外の体系(年棒制等)があることを考慮すると、salary_type と salary の二つの項目にしてしまうかとかは、もう少し業務の内容を見てみないと決められませんかね。
※固定給 + 時給、あるいは固定給+歩合制、なんてパターンもあるかもしれないので

投稿2018/08/07 02:11

編集2018/08/07 02:12
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

annderber

2018/08/07 03:02

コメントありがとうございます。 本文にも記載しましたが、今回の質問はーパータイプ、サブタイプと分けた場合で一部で共通化出来るフィールドをどうするかなので、そのあたりはいかがでしょうか。
tacsheaven

2018/08/07 03:04

スーパータイプ、サブタイプだと分けるとしたら、サブタイプ側に持たせます(同じフィールドになっても)。 その属性はサブタイプ側にあるものであって、スーパータイプでまとめるべきではないからです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問