- ベストアンサー
お気に入りをテーブルに格納する方法について
不特定多数の料理から、ユーザー毎にお気に入りの料理をマークし、お気に入りのカラムを後で検索させる用途がある場合、MySQLではどのようにテーブルに格納すれば良いでしょうか? ■お気に入りテーブルの格納例 案1)favaliteにSET型を使い1レコードで済ます PK ユーザーID favalite (天丼,牛丼,カレーライス) 案2)favaliteにTEXT型を使いカンマ区切りで代入。1レコードで済ます PK ユーザーID favalite (天丼,牛丼,カレーライス) 案3)favaliteにTEXT型を使い、お気に入り分レコードを追加(3レコード)流石に重いでしょうか? PK ユーザーID favalite 天丼 PK ユーザーID favalite 牛丼 PK ユーザーID favalite カレーライス
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
情報数が不定&増える可能性がある場合に、set型は不向きです。 長さが不定の場合を除き、text型を利用するメリットはありません。 案1にしても案2にしても、重複データを多量に持つことになる可能性がある上、情報の二次利用ができません。 案3は、データ量が数千万件~数億件にならないなら、処理の重さをそれ程心配する必要はないと思います。データ型もtextにする必要はなく、varcharでいいのではないでしょうか? 重複データを持たせないと考えるなら、#1回答者さんも言っているように、食事データを別表で管理し、食事コードで対応付ける方法も有効だと思います。 そうすれば、この食事が好物の顧客数、性別、年齢層、などなど、分析が可能になります。
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
検索や集計を前提としているのであれば正規化するべき です。処理が重いという意味ではレコードの数よりも 有効なindexがもてない1レコードでの管理の方が重くなる 可能性が高いです
お礼
MySQLでは、ENUMやSETは全てインデックスを持つ見たいです。ただ、カラムに対して1つの値を持つという方がわかりやすい気がしましたので、SET型を使うのはやめようと思います。
- salf
- ベストアンサー率42% (27/64)
テーブル設計の話と思わさせていただきます。 私の考えは基本的にDBは一意にデータ量のみが増えていく設計にするのがよいと思います。 なので、もし私が作るとすれば、 ユーザテーブルでユーザ情報を管理 食べ物テーブルで食べ物情報を管理 好物テーブルでユーザ情報と食べ物情報をくっつける。 という設計を取ります。 案的に私の考えに一番近いのは案3ですね。
お礼
基本的に一意にデータ量のみ増えていく設計。参考になりました。しかし未だSETを使われている方を見た事がないですし、#2の方も今回は向かないということで、SETを使うのはやめようと思います。 ありがとうございます。
お礼
MySQLならではのご回答までありがとうございます。 varcharの方が効率が良いんですね。 情報の二次利用という所、大変説得力があります。 コードを付けるかどうかは大量にデータを入れてテストしてみようと思います(^^)