【開発SE】DB設計の『スーパータイプ』と『サブタイプ』をチキンナゲットを使って簡単に説明する
記事の概要
開発SEは避けて通れないであろう『スーパータイプ』と『サブタイプ』について、イメージがしやすいように身近なものを使って説明する。
なぜチキンナゲットなのか?
ファーストフード店のサイドメニューにチキンナゲットがある。
店員さんに「ソースはマスタード、バーベキューどちらになさいますか?」と聞かれたら、どうするか?
- 『マスタード』か『バーベキュー』のどちらか1つを貰う。
- どちらも貰わない。
場合によっては、なんと『両方』というのも可能なようだ。
そして、なぜか思い付いた。
「これ、サブタイプの説明に使えそうだ」と。
サブタイプの種類はいくつかあるが、慣れないとなかなか実務でパッと思い出せなかったりすることもあるだろう。
そこで、身近な例として『チキンナゲットのソース』が適していると考えたのである。
本題に入る前に
お手元にチキンナゲットとコーラなどを用意し、つまみながら読んで頂いても良い。
その方が、より理解が深まるかもしれない。
また、細かい解説は省略し 『チキンナゲットの場合はこう!』という説明となる(笑)
とにかく、まずはイメージをしっかり掴み、必要に応じて書籍やネットで調べて欲しい。
スーパータイプとサブタイプの用語一覧
ひとまず用語だけ先に記述する。
その後、それぞれ説明する。
- 汎化と特化
- 排他的サブタイプ
- 共存的サブタイプ
- 包含
1.汎化と特化
特化とは
何かの基準によって分けることである。
例えば 『チキンナゲット』 という商品を、ソースの種類で分けると下記の通りである。
- バーベキューソース付きチキンナゲット
- マスタードソース付きチキンナゲット
尚、実装方法は『チキンナゲット』に『ソースを付けるか否か?』や『何のソースを付けるか?』という情報を 『区分』または『フラグ』 として持たせる。
汎化とは
言わば、特化の逆である。
下記の商品は、いずれも『チキンナゲット』であるという捉え方をする。
- バーベキューソース付きチキンナゲット
- マスタードソース付きチキンナゲット
2.排他的サブタイプ
概念データモデルでは下記の図のようになる。
『排他的』なので、つまりソースはバーベキューかマスタードのどちらか1つしかもらえない。
店員さんに「両方ください」と言っても「申し訳ございません、お客様。当店では1パックにつき1つしかご提供できません。」となる(笑)
ベン図だと下記のような表現になる。
実装方法は『区分』を持たせる。
テーブルのイメージは下記の通り(ナゲットの販売に特化した極端な例とする)
ソース区分マスタ
ソース区分コード(※主キー) | ソース区分名称 |
---|---|
1 | バーベキュー |
2 | マスタード |
ナゲット販売履歴(トランザクション)
ナゲット販売ID(※主キー) | ナゲット販売日時 | ソース区分コード(※外部キー) |
---|---|---|
1001 | 2024/09/23/11:30 | 1 |
1002 | 2024/09/23/11:37 | 2 |
1003 | 2024/09/23/11:42 | 1 |
上記のナゲット販売履歴を見ると、販売IDごとにソースは1種類しか貰えない。
3.共存的サブタイプ
概念データモデルでは下記の図のようになる。
『共存的』は先程の『排他的』とは異なり、両方同時に持つことが可能。
ソースはバーベキューとマスタードのどちらか1つでも良いし、両方とも貰っても良い。
店員さんに「両方ください」と言えば「どうぞ(^^)」となる(笑)
ベン図だと下記のような表現になる。
実装方法は『フラグ』を持たせる。
テーブルのイメージは下記の通り。この例ではトランザクションのみとする。
ナゲット販売履歴(トランザクション)
ナゲット販売ID(※主キー) | ナゲット販売日時 | バーベキューフラグ | マスタードフラグ |
---|---|---|---|
1001 | 2024/09/23/11:30 | 1 | 0 |
1002 | 2024/09/23/11:37 | 0 | 1 |
1003 | 2024/09/23/11:42 | 1 | 1 |
各フラグの 『0』が『貰わない』、『1』が『貰う』 である。
バーベキューとマスタードの両方『1』 であれば、両方とも貰える。
4.包含
概念データモデルでは下記の図のようになる。
これは『共存的』に近いが、更に単純である。
- ソースが付いているか、いないかの違い。
- ソースが付いていても、いなくても 『チキンナゲット』である。
ベン図だと下記のような表現になる。
実装方法は『フラグ』を持たせる。
テーブルのイメージは下記の通り。『共存的』を更に簡略化したイメージとなる。
ナゲット販売履歴(トランザクション)
ナゲット販売ID(※主キー) | ナゲット販売日時 | ソースフラグ |
---|---|---|
1001 | 2024/09/23/11:30 | 1 |
1002 | 2024/09/23/11:37 | 0 |
1003 | 2024/09/23/11:42 | 1 |
この例は『共存的』と同様、フラグの 『0』が『貰わない』、『1』が『貰う』 とした。
最後に
今回は『サブタイプ』を少し変わった切り口から説明してみた。
もし、エンジニアとして技術や理論で分からないことに遭遇した場合は、今回のように身近なものに例えると理解がしやすくなるかもしれない。
また、自身が経験を重ねて若手に教える立場となった時も『どうしたら分かり易く説明が出来るのか?』と考える1つの方法として良いかもしれない。
そして、ナゲットのソースはバーベキューやマスタード以外にも、期間限定の味もぜひ楽しんで頂きたく(笑)
ここまで読んで頂き、多謝! m(_ _)m
Discussion