質問: ### 知りたいこと 掲示板のテーブル設計ですが、1と2はどちらがいいのでしょうか。 1.`UNION`で生じる`null`を許す 2.あらかじめカラムに`null`を許す ### 1.UNIONで生じるnullを許す 下記のように「threads」と「comments」というテーブルに分けるならば、それらのカラムに`null`は生じません。 ↓「threads」 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/0a1b91ee2833f013eb9801b43195bb40.png) ↓「comments」 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/c0fc3b4600ae4ee1a2cebabb5b710047.png) ここでユーザーが ・スレッド1をフォロー ・ユーザー80をフォロー としていたとき、 彼のタイムラインに ・スレッド1へ投稿されたもの ・ユーザー80が投稿したもの を流すことを考えます。 その情報を取得すると以下のように「threads」と「comments」を`UNION`して、`null`や`0`などで埋めないといけないカラムが出てきてしまいます。 ↓「UNIONしたもの」 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/d2aef3f0e1b0679e56d0a1072ed022ae.png) 「thread_genre」は「threads」にしかないカラムだし、逆に「parent_comment_id」や「parent_thread_id」は「comments」にしかないカラムだからです。 ### 2.あらかじめカラムにnullを許す 他方、「threads」と「comments」というテーブルに分けず、下記のように「posts」に統合しておきますと、あらかじめ`null`を許しますが、`UNION`するコストがかかりません。 タイムラインに流す情報の取得は`SELECT`だけで済みます。 ↓「posts」 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/417bf22fdb5ab08810a1a04149feb384.png) ### 改めて ネットで検索する掲示板のテーブル設計といえば「threads」と「comments」をわけるものばかりです。 しかし、タイムラインのように「threads」と「comments」を統合して走査するケースがある場合に鑑みますと、2がいいのではと感じます。 タイムラインの情報としていずれにせよ`null`が介在せざるをえないのならば、2は`UNION`のコストが不要なためです。 テーブル設計は初めての初学者で、他にいい方法なども存じません。 2にすべきか、1にすべきか、他にもっと適切な設計があれば知りたいです。 尚、実際には「thread_genre」以外にもスレッドだけのカラムはたくさん(50個)ありますし、逆にコメントにしかないカラムもこの例よりたくさんあります。(なのでWordPressのようにEVAを採用するとレコードが増えすぎて心配ですし、取得のSQLの煩雑さも懸念されますのでEVAは避けたいです。) アドバイス宜しくお願い致します。
回答: ざっと見た感じ検索項目が違うなら別々に検索してあとで 合算すればいいような気がします。 煩雑になるほどむしろ項目名、値の組み合わせでデータを持つほうが 効率的かも