1

Oracle DBにテーブルがあります。たとえば、Studentテーブルです。StudentIDは、テーブルの主キーです。別の列に関心のあるサブジェクトがあります。たとえば、列名はinterested_SUBです。学生は複数の興味のある科目を持つことができます。この場合、次の2つのオプションがあります。

1)StudentID列とInterested_SUB列を複合主キーとして使用します。この場合、たとえば、学生が3つの科目に関心がある場合、列の値として(S1、SUB1)(S1、SUB2)および(S1、SUB3)を含むテーブルに3つの行があり、他のすべての列は同じになります。これらの3つの行の値。

2)StudentId列とInterested_SUB列を含む個別のテーブルと、最初のテーブルに追加の列を作成して、学生が複数の科目に関心があるかどうかを示します。この場合、studentIdとSUBを(S1、SUB1)として、新しいインジケーター列を「Y」として、studentテーブルの学生ごとに1行にします。2番目のテーブル(S1、SUB2)&(S1、SUB3)。

上記のオプションのどれがDBのパフォーマンスを向上させているかを教えてください。

前もって感謝します

4

5 に答える 5

2

学生テーブルには、学生に関する多くの値が含まれている可能性があります。オプション 1 の場合はどのようになりますか? たとえば、名前、年齢、または学期をすべての行に表示しますか? おそらくそうではありません。

通常、student-table と subject-table の両方を単独で使用します。3 番目のテーブルには、2 つのテーブルを接続するための情報が含まれています。そこには、1 人の学生に属する複数の行を含めることができますが、科目は異なります。

学生:  
1、ミスターX  
2、Yさん

科目:  
1、コンピュータサイエンス  
2、数学

学生_科目:  
1, 1 // ミスター X はコンピューター サイエンスが好き  
1, 2 // ミスターXも数学が好き  
2, 2 // Yさんは数学だけが好き

これはおそらく、すべてを 1 つのテーブルに書き込むほど効率的ではありません。しかし、早すぎて理由もなくパフォーマンスについて考えるべきではありません。

于 2010-07-20T11:37:22.187 に答える
1

「パフォーマンス」は、制作シナリオが何であるかに関するいくつかの指標がないと判断するのが非常に困難です (例: 生徒数、科目数、複数の科目に関心を持つ生徒の予想割合は?)

一方、2番目のソリューションは設計の点でかなり悪いです(直観に反し、DBスキーマを見てすぐには明らかではないロジックに依存しています。誰かが自分の興味の1つを削除したい場合は複雑になります。 ..) そして、それがより「効率的」であるというかなりありそうにないケースでさえ、実際の利益は複雑さの増加によって大きく影を落とされます.

要するに、解決策 2 は忘れてください。

于 2010-07-20T11:40:16.157 に答える
0

あなたが説明しているのは交差点テーブル(別名ジャンクションまたはリンク)テーブルです。これは、多対多の関係を表すための一般的な構成です。学生に関する一般的な情報(名前、生年月日など)を含むSTUDENTSテーブルと、科目に関する一般的な情報(名前、教師など)を含むSUBJECTSテーブルがあります。どの学生がどの科目に興味を持っているかを示すには、STUDENT_SUBJECTSテーブルが必要です。

キーに関しては、厳格なルールはありません。理論では、複合自然キー(STUDENT_ID、SUBJECT_ID)が優先されます。テーブルに関連付けられている他の列またはデータがない場合、これが私の選択になります。ただし、ASSIGNMENTS、TESTSなどの他のデータがSTUDENT_SUBJECTSに依存する可能性があることを想像するのは不合理ではありません。この場合、合成主キー(STUDENT_SUBJECT_ID)は、外部キーとして伝播されるとはるかに管理しやすくなります。ただし、一意の制約を通じて自然キーを適用し続けることが重要です。

于 2010-07-20T12:32:19.463 に答える
0

実際のデータベースでは、大きなテーブルの場合、キーが単純であるほど良いです。これにより、スキャンと結合がはるかに高速になり、RAM の消費が少なくなります。人工の数値キーは、非数値および/または複合キーよりも高速でスケーラブルな場合があります。

あなたの場合、間違いなく正規化を行ってください。高速になる (行数が減る) だけでなく、ドメインの表現が向上し、壊れにくくなります (1 人の学生の複数の行を同期させることを心配する必要はありません)。

于 2010-07-20T11:37:51.307 に答える
0

データベースのパフォーマンスに関する質問は、状況について詳しく知らなければ答えられません

  • テーブルの大きさはどのくらいになりますか?
  • 学生は何科目まで持つことができますか? (「複数」とは、5 つまたは 100 を意味します)
  • 繰り返される列の数は?
  • どのような種類のクエリを実行しますか?
  • テーブルにはどのようなインデックスがありますか?

そして、それは表面をなぞっただけです。決定的に何かを言えるようにするに は、まだテストする必要があります。

一般に、正規化は「よりクリーンな」オプションであり、物事をよりシンプルで簡単にします。しかし、正規化を解除すると、多くの場合、速度が向上します。追加のパフォーマンスが絶対に必要でない限り、正規化を使用します。

于 2010-07-20T11:38:58.443 に答える