質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

434閲覧

掲示板とコメントとタグのテーブル設計

nyuuinkanja

総合スコア8

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2020/03/25 11:14

編集2020/03/25 11:52

##<前提>
掲示板にタグがついています。
そしてそのタグを元にして、掲示板へのコメントが検索できるようになっています。

######テーブル構成

mysql > posts

post_idparent_thread_idpost_typetext
10thread#海 と #山 についての掲示板
20thread#空 についての掲示板
31comment槍ヶ岳について #優しく 教えてください

mysql > tags

tag_idtag_name
1
2
3
4優しく

mysql > tag_relations

relation_idpost_idtag_id
111
212
323
434

######検索機能
検索機能は、上の3つのテーブル構成のとき、「#山」で検索すると以下2つが取得できるような機能です。

post_idparent_thread_idpost_typetext
10thread#海 と #山 についての掲示板
31comment槍ヶ岳について #優しく 教えてください

「#山」は「post_id=1」が持っているのでまず取得します。
さらに「parent_thread_id」によって「post_id=1」へのコメントとして「post_id=3」も取得されます。

##<質問>
tag_relationsのテーブルに、以下のように「relation_id=5」と「relation_id=6」も追加すべきでしょうか?

mysql > tag_relations

relation_idpost_idtag_id
111
212
323
434
531
632

「relation_id=5」は、「post_id=3」が「#海(tag_id=1)」を持っているという意味です。

実際には「post_id=3」は「#優しく(tag_id=4)」しか持っていないので、前提のテーブル設計はそうなっていました。

ですが、このコメントの投稿先掲示板は「#海(tag_id=1)」と「#山(tag_id=2)」を持っているので、tag_relationsのテーブルにそのことを追加すべきかどうかというのが質問になります。

それがなくても検索はできるので不要でしょうか?
それともきちんと追加した方がいいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nyuuinkanja

2020/03/25 11:25

ベストアンサーを決めるということでしょうか?yambejpさまとやりとりの最中なので、ひとまずそのままにしている状態です。
m.ts10806

2020/03/25 11:28 編集

流れとして同じものであればそちら解決してからでないと、 こちらの質問内容にあるコードやデータの状態も変わってくるのではないですか? 何度か目にすることがあります。 質問している中で新たな疑問がわいて、そのときのコードそのままで新規に質問してしまい、結局前の質問で解決した内容でコードが変わり、整合性が取れなくて混乱してしまうパターン。
nyuuinkanja

2020/03/25 11:34

なるほど、お気遣いありがとうございます。そちらの質問はpostsからの取得についてですが、こちらの質問でtag_relationsのレコードが増減しても、特に影響はなさそうです。
m.ts10806

2020/03/25 11:35

レコード・・・はともかく今回はテーブル構成のほうを気にしています。
nyuuinkanja

2020/03/25 11:41

うーん、一方の質問の如何でもう一方のテーブル構成が変わることはないですね。ご心労おかけしてすみません。
m.ts10806

2020/03/25 11:43

いえいえ、こちらもちょっと深く突っ込みすぎました。
yambejp

2020/03/25 11:45

「槍ヶ岳について #優しく 教えてください」が検索をかけるとなぜ 「山について #優しく 教えてください」に変化するのでしょうか
nyuuinkanja

2020/03/27 04:04 編集

すみません、誤字です。いずれも「槍ヶ岳」に修正いたしました。
guest

回答1

0

ベストアンサー

post_id=3は紐付けが4=優しくにしかされていないので
山ではひっぱれません
そうしたいならtag_relationsにpost_id=3,tag_id=2を
追加してください

投稿2020/03/25 11:57

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/03/25 11:59

「槍ヶ岳について #優しく 教えてください #山」 のようなハッシュタグで連携するならrelation用の テーブルはいらないですけどね
nyuuinkanja

2020/03/25 12:09

いつもありがとうございます。 >post_id=3は紐付けが4=優しくにしかされていないので 山ではひっぱれません 以下の流れで取得できませんでしょうか? 「#山」で検索 ↓ 「#山(tag_id=2)」を持つ「post_id=1」を取得 ↓ 「post_id=1」を「parent_thread_id」として持つ「post_id=3」を取得
nyuuinkanja

2020/03/27 04:03

こちらで「山」から「post_id=3」を取得できていると思うのですが、何か誤解ありますでしょうか? SELECT * FROM posts WHERE parent_thread_id = ( SELECT post_id FROM relations WHERE tag_id = ( SELECT tag_id FROM tags WHERE tag_name='山' ) )
yambejp

2020/03/27 04:43 編集

なるほどparent_thread_idの使い方がそういうことですか post_id=3は親属性1(海、山)と、独自の属性(優しく)を 持つということですね データ管理が煩雑になりそうですが、親属性を引き継ぐのが マストであればそういうやり方でもよいでしょう 単純な親子だけならそれなりですが、多段になった場合 そうとうめんどくさい仕様になりそうです(親=孫、親=ひ孫) 上記親子関係で処理するなら質問の5,6は不要です
nyuuinkanja

2020/03/27 06:32

ご返信ありがとうございます。 煩雑ですよね。5,6を追加すればその煩雑さがなくなるかと考えたのですが、やはり追加しない方がいいでしょうか? 完成形はこちら(http://sqlfiddle.com/#!9/5a682f/1)でして、もし5,6を追加すればこちらの➃がなくても➂だけで機能し、煩雑さがなくなります。 そのために5,6を追加した方がいいのかと悩んでいる次第です。 しかし5,6を追加するとtag_relationsのデータが多くなってしまいますし、どうしたらいいと思いますか…?
nyuuinkanja

2020/03/27 06:36

>単純な親子だけならそれなりですが、多段になった場合 そうとうめんどくさい仕様になりそうです(親=孫、親=ひ孫) ですね。お気遣いありがとうございます。多段(reply)は今回のSQLでは取得しないつもりです。threadとcommentだけを考えております。
yambejp

2020/03/27 06:54

親子だけならそのままで大丈夫でしょう(5,6不要) 多段にする場合は木構造をつかった管理にするとすっきりします なにかの機会があれば試してみてください (プロシージャで更新処理を入れるので最初は ハードルが高いかも・・・)
nyuuinkanja

2020/03/27 07:30 編集

なるほど。ちなみにどうして5,6不要なのでしょうか? 先のリンクについて、➃がない方が処理が早いと考えているのですが(5,6を追加すれば➂だけで➃の情報が取得できるため)、それとも5,6を追加しtag_relationsのデータが多くなるとJOINの量が増えて逆に速度は遅くなるということですか?
yambejp

2020/03/27 07:30

> どうして5,6不要なのでしょうか? 親子関係があって、親の属性を引っ張る仕様のテーブル構成だからです 逆に5,6をつけると親の属性が変更になったとき、あわせて 追加削除が必要になり、親からもらうのか、自分属性だけ直接 参照するのか1本化した方がよいという意図です
nyuuinkanja

2020/03/27 07:31

なるほど。どうもありがとうございます。納得できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問