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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

327閲覧

中間テーブルがあった場合の「以外」を実現するテーブル設計を相談したいです!

aaaaabbb

総合スコア8

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2025/04/21 11:31

実現したいこと

以下の3つのテーブルがあったとします。

  • 授業テーブル(courses)
  • 学生テーブル(students)
  • 授業学生テーブル(中間テーブル course_students)

今まで、その授業を受けられる学生を管理するのに、授業学生テーブルにレコードを作っていました。

<授業テーブル>

idname
1数学
2英語

<学生テーブル>

idname
1太郎
2花子

<授業学生テーブル>

idcourse_idstudent_id
123
233

今回、「この学生は、特定の授業**"以外"**を受けられる」ということをテーブルで管理したいと思っています。
これを実現できるテーブル設計を相談したいです。

発生している問題・分からないこと

以下の2案を考えました。
ただしっくりきておらず、何か他に良い方法があればご教示いただきたいです。

(1) テーブル構造はそのまま
「数学以外」なら、数学以外の授業のレコードをすべて授業学生テーブルにinsertしてしまえばいいかなと思いました。
ただその場合、授業が新規登録されたことをトリガーに授業学生テーブルに新たな授業をinsertするcallbackが必要になるため、ぱっと見謎のcallbackが発生するのは良くないなと感じています。

(2) 中間テーブルに「可能」カラムを設ける
受けられる授業は「可能」カラムをtrueとして、「以外」の場合はfalseを入れます。ただこの場合、受けられる授業のレコードと、以外で設定したい授業のレコードが混在する形です。
テーブルとしてわかりにくくないだろうかと感じています。

idcourse_idstudent_idable★
123true
233true
214false

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

なにか案がありましたら、お手数ですがご教示のほどよろしくお願いいたします。

補足

特になし

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

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

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

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

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

sazi

2025/04/22 01:24

授業学生テーブルは選択後の授業ですか?それとも選択する際の選択肢ですか?
sk.exe

2025/04/22 03:16 編集

> この学生は、特定の授業**"以外"**を受けられる この場合における「受けられる/受けられない理由」として、 具体的にどういったものを想定されているのでしょうか。 - その時点において、その授業(科目)の単位を未取得/取得済みである。 - その時点において、その授業を受ける(科目を履修する)ために必要な条件を満たしている/満たしていない。 - 特に決まった理由はない(大雑把に受講の許可/禁止をコントロールしたい)。
logres_Fan

2025/04/22 09:33

グループ単位で管理しないの?学年学部学科クラスなど所属ごとに。 授業テーブルと学生テーブルだけじゃ煮ても焼いても食えないよ。
guest

回答3

0

ベストアンサー

course_student_exclusions みたいな、「以外」を管理する別テーブルを用意したほうが良い気もします。
優先順位があるなら、どちらかをselectしてレコードがあったら終了、みたいなのもの出来ますし。

テーブル構造がそのままだと、「可能」として登録されたのか、「以外」で登録されたのか分からなくなります。
フラグ追加は上記のについては対応できそうですが、記載されている通り分かりにくいです。
ただし、unique indexなどを設けることで、ありえないパターンがDBに入るのを防げるというメリットはあります。
フラグ追加パターンの場合、ableがtrueとfalseが混在している生徒が想定されるのか、想定される場合、どれを受けることが可能なのか等によっても変わってきそうです。

提示のやり方でも実現は可能ですし、完全な正解はないと思いますので、最終的にはコードにする工数、実装コードの可読性や、メンテナンス性の部分で決めても良いのかなとは思います。

投稿2025/04/21 11:57

Eggpan

総合スコア3255

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

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

aaaaabbb

2025/04/22 10:04

ご回答ありがとうございます!勉強になりました! わかりやすくご回答いただき、とても助かりました!
guest

0

サンプルから最終結果を予測しづらいのでなんともいえませんが

「この学生は、特定の授業**"以外"**を受けられる」

という命題は、「特定のユーザーが受けられない授業」という中間テーブル(ブラックリスト)を用意すれば十分でしょう

投稿2025/04/22 00:24

編集2025/04/22 00:25
yambejp

総合スコア117630

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

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

aaaaabbb

2025/04/22 10:05

ご回答ありがとうございます!その発想はなかったので勉強になりました!
guest

0

授業学生テーブルを授業の選択肢として考えると、ステータスを項目追加して選択可/不可とする方が良いと思います。
授業に対して選択可/不可は何れかであり、同一のテーブルであれば単純な制約で済みます。

中間テーブルは結果を格納するという事であれば、不可の結果は格納されるはずもないので、当然別テーブルでの管理ですね。
その場合、授業同士で排他的な関係など(例えば選択したコースによって可/不可が決まる)では、授業の定義に対して関係性を持たせる方が複雑にならなくて済む場合もあると思います。

投稿2025/04/22 03:53

編集2025/04/22 06:15
sazi

総合スコア25426

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

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

aaaaabbb

2025/04/22 10:06

ご回答ありがとうございます! ステータス項目の追加は思いつかなかったので、とても勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問