🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1890閲覧

データベースの中間テーブルについて

ateta

総合スコア3

MySQL

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/02/03 21:44

編集2021/02/03 23:15

中間テーブルというものが気になった、普段データベースを全く触らないど素人の者です。

以下のようなテーブルがあり、ユーザーが選択しているcourseを取得したい場合は、
処理的には中間テーブルを頭からから全部走査してuserが選択しているcourseを取得するような処理がされるのでしょうか?
となるとデータの数が膨大な場合、中間テーブルを使用してデータを取得するのはかなり重い処理になると思うのですが内部で最適化がされている等があるのでしょうか?
ド素人の質問で恐縮ですがよろしくお願いいたします。

userテーブル

idname
1Takahashi
2Sato

courseテーブル

idlanguage
1HTML
2CSS
3C

中間テーブル(course_usersテーブル)

user_idcourse_id
11
12
13
22
23

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/02/03 22:27

中間テーブルの course_id はcourseテーブルの id になるのでは?
hentaiman

2021/02/03 22:35

内部で最適化ってDBが勝手に最適化してくれると思ってるという意味なのかどうか
ateta

2021/02/03 23:16

中間テーブルのIDが間違っていたため修正しました。 DBが勝手に最適化してくれることがあるのかなと思っていました。 回答を見て把握できました。ありがとうございます。
guest

回答2

0

ユーザーで絞り込んだ中間テーブルをメインにしてそれぞれJOINすればいいと思うのだけど、そうではなくて?

最適化云々はテーブルの正規化とかにも関わるので
INDEXとか含めたテーブル定義提示されないと何とも言えない部分はあります。
course_idにidではなくlanguageそのものが入ってるのは謎ですが(Railsのルール的に出来ないはずなので、おそらく間違いと思いたい)。

まずはSQL単体で想定のデータが取得できるようにし、実行計画とってパフォーマンスの確認を。

投稿2021/02/03 21:55

編集2021/02/03 22:20
m.ts10806

総合スコア80875

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

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

ateta

2021/02/03 23:13

languageそのものが入ってしまっていたのは間違いです。すみません。修正しておきます。 ありがとうござました!!
guest

0

ベストアンサー

ユーザーが選択しているcourseを取得したい場合は、処理的には中間テーブルを頭からから全部走査してuserが選択しているcourseを取得するような処理がされるのでしょうか?

インデックスなど何もない場合は、そのような動作しかできないですね。

データの数が膨大な場合、中間テーブルを使用してデータを取得するのはかなり重い処理になると思うのですが内部で最適化がされている等があるのでしょうか?

それは、インデックスを適用したり、アクセスプランが最短になるようにSQLを組んだりするなどチューニングが必要です。

SQLチューニング以外は、テーブルの正規化やインデックスの設定など基本的な設計の部類です。

投稿2021/02/03 22:43

sazi

総合スコア25327

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

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

ateta

2021/02/03 23:13

インデックスの利用などをする必要があるのですね。わかりました。 ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問