• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:勉強でSNSを作っています。)

SNSのタグの実装方法について

このQ&Aのポイント
  • SNSのタグの実装方法について悩んでいます。一つのエントリに複数のタグを付ける設計ですが、データベースの格納方法が分かりません。考えられる方法は、一つのレコードにまとめてタグを格納する方法と、別のタグテーブルを用意してタグを格納する方法です。
  • 一つのレコードにまとめてタグを格納する方法の場合、エントリごとにタグの一覧をカンマ区切りで格納します。これに対して、別のタグテーブルを用意する方法では、各エントリごとにタグのレコードを追加します。
  • どちらの方法が良いか悩んでいます。一つのレコードにまとめる場合はデータの冗長性が減りますが、データの扱いが少し複雑になります。一方、別のテーブルを用意する場合、データの扱いは簡単ですが、データの冗長性が増えます。選択する方法にはそれぞれメリットとデメリットがあります。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

>なぜaの方式を採っている 可能性として3つ (1)データが簡潔である (2)データの前後関係が明示できる (3)工夫次第でスピードを早めることができる つまりSQLとして集計、抽出を考えなければ実は冗長なAでもやりようがあるということです。 一方Bのメリットは (1)抽出が効率的 (2)集計が効率的 (3)データ管理が簡便 といったところです。正規化は必ずしも高速化に直結はしませんが、往々にして 検索性が高い方が高速化しやすいです。

bulldozerQ
質問者

お礼

なるほど、正規化したからといって必ず高速になるとも限らないのですね。 しかしBの方が確かに検索は圧倒的にやりやすそうです。 最後になりますが、皆様どうもありがとうございました。 複数のやり方の一長一短を説明していただき、非常に参考になりました。 取りあえず両方のやり方でコードを書いて、それからどちらにするか決定しようと思います。

その他の回答 (3)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

RDBでという前提であればAはよほどのことがないかぎり選ばないですね。 Bを基本に詰めた方がよいでしょう。 運用方法はSQLの種類によります。

bulldozerQ
質問者

お礼

ありがとうございました、参考になりました。

回答No.2

今回の場合はaでいいかなと思います。(はてな式ですね) このへんの関数が便利です http://dev.mysql.com/doc/refman/4.1/ja/string-functions.html#id471251 追加・削除がちょっと工夫いるかもしれません。 1:n:1にする設計もありますがタグくらいなら別にいらないかな。と思います。

bulldozerQ
質問者

お礼

ありがとうございました、参考になりました。

bulldozerQ
質問者

補足

お答えいただきありがとうございます。 追加で疑問に思ったことがあるのですが、はてなはなぜaの方式を採っているのでしょう? ここまで3名の方にヒントをいただき、b方式が一般的な解であるような印象を受けました。 mogura_198様のお答えからも、タグであればa方式で構わないだろうという留意付きでの推奨という感じを受けました。 はてなの印象として動作が遅いイメージがありますが、それはa方式にしていることと関係があったりするのでしょうか。 また、はてな以外のタグがあるサービスではb方式を採っているのなら、それが何故なのかを知りたいです。

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

「タグから、そのタグを使用しているエントリを検索」することを考えると、aはダメで、bにすべきでしょう。(aでもLIKEで検索できないこともないですが効率が悪いです)

関連するQ&A