

RDBのカラムをどう設計するか悩んでいます。一つのカラムに複数要素が入る可能性がある場合はどのように設計すべきなのでしょうか？

例えば、「にわとり」、「わに」、「すずめ」、「カモノハシ」を格納するテーブルを設計したいとします。このとき、「にわとり」、「わに」、「すずめ」までは以下のテーブルで問題なく格納できます。

生物名 | 類 | 飛ぶかどうか  
---|---|---  
にわとり | 鳥 | 飛ばない  
わに | 爬虫 | 飛ばない  
すずめ | 鳥 | 飛ぶ  
  
しかし、「カモノハシ」は卵を産むため哺乳類と爬虫類の両方に属します。  
したがって、テーブルは以下のようになりそうですが、もっとうまい設計はあるのでしょうか？

生物名 | 類 | 飛ぶかどうか  
---|---|---  
にわとり | 鳥 | 飛ばない  
わに | 爬虫 | 飛ばない  
すずめ | 鳥 | 飛ぶ  
カモノハシ | 哺乳、爬虫 | 飛ばない  
  
僕が考えたもう一つの設計は、「哺乳類」、「爬虫類」…「魚類」のようなカラムを作り、ブール変数で管理するというものです。（あまりよくなさそう）  
アドバイスを頂けると幸いです。


CC BY-SA 4.0
2022-04-11T14:41:22.743
88273
2022-04-11T23:16:58.803
2022-04-11T16:30:46.833
3060
52183
question
database データベース設計
一つのカラムに複数の要素が入る可能性がある場合、どのように設計すべきか


どういう構造が良いかは、何を表現したいのか(どんな用途で利用したいのか)に依るかと思います。

* * *

「一つのカラムに複数の要素が入る可能性がある」状態を非正規系と呼び、その状態を正す操作を正規化と言います。

単に正規化したい、ということであれば、次のようなものになると思います。  
斜体項目が主キーです。

_生物名_ | 飛ぶかどうか  
---|---  
にわとり | 飛ばない  
わに | 飛ばない  
すずめ | 飛ぶ  
カモノハシ | 飛ばない  
  
_生物名_ | _類_  
---|---  
にわとり | 鳥  
わに | 爬虫  
すずめ | 鳥  
カモノハシ | 哺乳  
カモノハシ | 爬虫  
  
このような正規化を行う手順については、情報処理技術者試験で頻出しているので、そちらの解説書籍・サイトを参照するのが良いかと思います。

* * *

そもそもカモノハシは(爬虫類ではなく)卵を産む哺乳類([Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%A2%E3%83%8E%E3%83%8F%E3%82%B7))ということだそうなので、「卵を産むかどうか」を表現したいのであれば「類」でなく別の項目を設けるべきかもしれません。

_生物名_ | 類 | 飛ぶかどうか | 卵を産むかどうか  
---|---|---|---  
にわとり | 鳥 | 飛ばない | 産む  
わに | 爬虫 | 飛ばない | 産む  
すずめ | 鳥 | 飛ぶ | 産む  
カモノハシ | 哺乳 | 飛ばない | 産む


CC BY-SA 4.0
2022-04-11T23:16:58.803
88276
2022-04-11T23:16:58.803
2808
88273
answer