- ベストアンサー
SNSのタグの実装方法について
- SNSのタグの実装方法について悩んでいます。一つのエントリに複数のタグを付ける設計ですが、データベースの格納方法が分かりません。考えられる方法は、一つのレコードにまとめてタグを格納する方法と、別のタグテーブルを用意してタグを格納する方法です。
- 一つのレコードにまとめてタグを格納する方法の場合、エントリごとにタグの一覧をカンマ区切りで格納します。これに対して、別のタグテーブルを用意する方法では、各エントリごとにタグのレコードを追加します。
- どちらの方法が良いか悩んでいます。一つのレコードにまとめる場合はデータの冗長性が減りますが、データの扱いが少し複雑になります。一方、別のテーブルを用意する場合、データの扱いは簡単ですが、データの冗長性が増えます。選択する方法にはそれぞれメリットとデメリットがあります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>なぜaの方式を採っている 可能性として3つ (1)データが簡潔である (2)データの前後関係が明示できる (3)工夫次第でスピードを早めることができる つまりSQLとして集計、抽出を考えなければ実は冗長なAでもやりようがあるということです。 一方Bのメリットは (1)抽出が効率的 (2)集計が効率的 (3)データ管理が簡便 といったところです。正規化は必ずしも高速化に直結はしませんが、往々にして 検索性が高い方が高速化しやすいです。
その他の回答 (3)
- yambejp
- ベストアンサー率51% (3827/7415)
RDBでという前提であればAはよほどのことがないかぎり選ばないですね。 Bを基本に詰めた方がよいでしょう。 運用方法はSQLの種類によります。
お礼
ありがとうございました、参考になりました。
- はせがわ もぐら(@mogura_198)
- ベストアンサー率66% (14/21)
今回の場合はaでいいかなと思います。(はてな式ですね) このへんの関数が便利です http://dev.mysql.com/doc/refman/4.1/ja/string-functions.html#id471251 追加・削除がちょっと工夫いるかもしれません。 1:n:1にする設計もありますがタグくらいなら別にいらないかな。と思います。
お礼
ありがとうございました、参考になりました。
補足
お答えいただきありがとうございます。 追加で疑問に思ったことがあるのですが、はてなはなぜaの方式を採っているのでしょう? ここまで3名の方にヒントをいただき、b方式が一般的な解であるような印象を受けました。 mogura_198様のお答えからも、タグであればa方式で構わないだろうという留意付きでの推奨という感じを受けました。 はてなの印象として動作が遅いイメージがありますが、それはa方式にしていることと関係があったりするのでしょうか。 また、はてな以外のタグがあるサービスではb方式を採っているのなら、それが何故なのかを知りたいです。
- mtaka2
- ベストアンサー率73% (867/1179)
「タグから、そのタグを使用しているエントリを検索」することを考えると、aはダメで、bにすべきでしょう。(aでもLIKEで検索できないこともないですが効率が悪いです)
お礼
なるほど、正規化したからといって必ず高速になるとも限らないのですね。 しかしBの方が確かに検索は圧倒的にやりやすそうです。 最後になりますが、皆様どうもありがとうございました。 複数のやり方の一長一短を説明していただき、非常に参考になりました。 取りあえず両方のやり方でコードを書いて、それからどちらにするか決定しようと思います。