例えば一つのレコードが複数のカテゴリに関連する場合、
(レコード1は、カテゴリ1と2に属する)
■レコードテーブル
・レコードID
・タイトル
・内容
■カテゴリテーブル
・カテゴリID
・カテゴリ名
どちらの方がベターな設計でしょうか?
1.レコードテーブルに「カテゴリID」フィールドを用意し、カンマ等で区切って格納する。
2.レコードとカテゴリを関連付けするテーブルを用意する。
今まで2のみでやってきましたが、1のパターンも見ることがあるため質問してみました。
どちらかではなく、こんなときはこっちの方がよいという例があればそれもありがたいです。
基本的には
>2.レコードとカテゴリを関連付けするテーブルを用意する。
ですね。
私が設計する場合なら、よほどのことがない場合はこうします。
「よほどのこと」というのは
・カテゴリに対する検索が発生しない
・複数行のレコードがそれぞれどのカテゴリに属しているかを横に連結して表示させるクエリが圧倒的に多い
・絶対に仕様の拡張が発生しない
という、まああまり考えたくない仕様ですw
基本的には
>2.レコードとカテゴリを関連付けするテーブルを用意する。
ですね。
私が設計する場合なら、よほどのことがない場合はこうします。
「よほどのこと」というのは
・カテゴリに対する検索が発生しない
・複数行のレコードがそれぞれどのカテゴリに属しているかを横に連結して表示させるクエリが圧倒的に多い
・絶対に仕様の拡張が発生しない
という、まああまり考えたくない仕様ですw
ありがとうございます。
今まで2でやってきたのですが、
1だとテーブルの数を減らせるのでスマートになる場合もあるのかな
という不安に駆られて質問しました。
たまにレコードテーブルにカテゴリフィールドを固定で5つ用意するパターンも見ます。
この場合これ以上の拡張は無い前提ですが、
他の場合に流用できないのでどうなのかなと感じていました。
>たまにレコードテーブルにカテゴリフィールドを固定で5つ用意するパターンも見ます。
1を利用する場合、まさにこれですよね。
こんな事例がありました。
商品Aの規格をデータベースに格納する際に、どのように入れたらよいかというものです。
角度が10度刻みのものもあれば5度刻みのものもあり、式にできない適当な刻みも存在してたり・・・。
5,10,18,22,50,100,120,180といった感じです。仕方がないのでカンマ区切りにしました。
このデータは発注などの入力制御にも使用します。
そのフィールドにあるかどうかで判断できるのでこれでよかったんじゃないかと思います。
フィールドの数が固定ではないのでこちらをえらびました。
2の方法でやった場合、
上記の例だと8個のレコードになるので、在庫処理をする際にめんどくさく感じて。
ありがとうございます。
なるほど納得です。
レコード数を意味もなく増やすことには疑問を感じていました。
すっきりしました。
memo77 さんが回答しているように、RDBの原則では「2.レコードとカテゴリを関連付けするテーブルを用意する」となります。
しかし、Web業務ではカテゴリIDが変化することが多いので、「1.レコードテーブルに「カテゴリID」フィールドを用意し、カンマ等で区切って格納する」を使うことが多くなっています。
たとえば、HTML の <meta name="keywords"> タグのようなデータ構造の場合、「カテゴリID」ではなく「カテゴリ名」そのものをカンマ区切りで記述するような形になっています。
ありがとうございます。
いろいろと知識の根拠付けができました。
ありがとうございます。
今まで2でやってきたのですが、
1だとテーブルの数を減らせるのでスマートになる場合もあるのかな
という不安に駆られて質問しました。
たまにレコードテーブルにカテゴリフィールドを固定で5つ用意するパターンも見ます。
この場合これ以上の拡張は無い前提ですが、
他の場合に流用できないのでどうなのかなと感じていました。