1

それで、昨日、同じ考えに基づいた 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 つの学校、ユーザー!」と言うだけで簡単に解決できますが、私はこれを捨てたいと思っています。

4

3 に答える 3

1

次に、「files_grade」ジャンクション テーブルに 2 つのレコードを書き込みます。

files_grade_id、files_id、および grades_id ie

files_idgrades_idの組み合わせは既に一意であるため、ここでの files_grade_id は冗長です(したがって、主キーとして設定できます)。

しかし、理論的には、小学校、中学校、高校など、複数の「学校」を持つこともできます。ファイル エントリに中、高のグレード 1、2 がある場合はどうすればよいですか?

必要に応じて、以前の学年からの「継続」としてそれらを保存することもできます。たとえば、1-6 初級、7-9 中、10-12 高などです。次に、成績テーブルを完全に使用せずに済ませることができます (これらの数値をfiles_gradeテーブルに格納するだけでよいため)。

于 2010-02-19T02:40:12.723 に答える
0

あなたの最初の質問はすでに回答されているので、2番目の質問に挑戦します。

これを行うには複数の方法がありますが、1 つの可能性として、"Schools" 用に別のテーブルを追加し、それをジャンクション テーブルの一部として含めることです。もちろん、ジャンクション テーブルの名前を新しいデザインに合わせて変更します。したがって、次のようにすることができます。

School Table:

-------------------------
  SchoolId  |   School  
-------------------------
     1      | Elementary
     2      | Middle
     3      | High
-------------------------

Files_grades_school

------------------------------------
  FileId  |   GradeId  |  SchoolId 
------------------------------------
    345   |      1     |      1
    345   |      1     |      2

使用パターンに基づいて、複数のインデックスを作成することをお勧めします。

于 2010-02-19T03:41:25.697 に答える
0

音からすると、かなりいい音です。ただし、ブリッジ テーブル (FILES_GRADES) の ID は実際には必要ありません。必要な場合は、ID をインクリメントする必要があります。

grade_id と file_id の 2 つの部分からなる主キーがあり、files_grade_id は複雑になるだけであり、select で決して使用しないため、不適切なインデックスになります。

于 2010-02-19T02:32:51.717 に答える