それで、昨日、同じ考えに基づいた 2 つの質問をしました。A- が正規化されておらず、B- が私の無知のせいで混乱したデータベースの再編成です。一日の大半を自分の考えを整理し、読み上げ、いくつかのテストに取り組みました。今日、DB がどのように見えるべきか、どのように動作するべきかについて、より良いアイデアが得られたと思いますが、適切な SQL DB の設計と正規化プロセスの核となる考え方を理解していることを確認したかったのです。
もともと、ファイルに関するデータ(URL、アップロード日、アップロードした人のユーザーIDなど)を保持する「ファイル」と呼ばれる1つのテーブルと、そのファイルを使用する可能性のある学年レベルを表す「成績」と呼ばれる列がありました為に。(参考: これらのファイルは学校の授業計画です)正規化に関するルール #1 に違反していることに気付きました。「成績」を「1,2」、「2,6」、または「3,5,6」のように保存していました。 」を 1 列に。これは、3 年生のみのレッスンまたは 5 年生のみのレッスンを見たい場合に、そのデータを解析しようとすると大きな頭痛の種になりました。
私に提案され、後で明らかになったのは、3 つのテーブルがあるということでした。
files (ファイルに関するデータ、URL など) grades (利用可能な学年レベルの表。おそらく 1 から 6 まで) files_grades (ジャンクション テーブル)
意味あり、。やる前に自分のやっていることを理解していることを確認したいだけです。ユーザー A がファイル xyz をアップロードし、2 年生と 3 年生に適していると判断したとします。
そのファイルに関するデータ (kb サイズ、url、説明、名前、プライマリ キー files_id) を含む "files" テーブルに 1 つのレコードを書き込みます。ID 345 を取得するとしましょう。
評定オプションの数が限られているため、評定は ID と同等になる可能性があります (つまり、Grade 1 は grades_id 1、Grade 2 は grades_id 2)。
次に、「files_grade」ジャンクション テーブルに 2 つのレコードを書き込みます。
files_grade_id、files_id、および grades_id ie
1,345,2
1,345,3
files_id 345 が適している 2 つのグレードを表します。次に、魔法の SELECT および JOIN ワンドを振って、必要なデータを取得します。
これは理にかなっていますか?繰り返しになりますが、リレーショナル多対多データベースの適切な構造を誤解していますか?
問題 2 : レッスンには複数の「グレード」を含めることができます。問題ありません。問題は解決しました (願わくば!)。しかし、理論的には、小学校、中学校、高校など、複数の「学校」を持つこともできます。ファイル エントリに中、高のグレード 1、2 がある場合はどうすればよいですか? これは、「ファイルごとに 1 つの学校、ユーザー!」と言うだけで簡単に解決できますが、私はこれを捨てたいと思っています。