9

ある学校の生徒のデータベースを作成しています。これまでのところ、次のようになっています。 ここに画像の説明を入力してください

読みたくない場合は、「要するに」の部分にジャンプしてください

問題は、私がこのデザインに満足していないということです。との組み合わせgradeをユニークにし、生徒のテーブルの主キーとして機能させたいと思います。を削除して3から複合キーを作成することはできますが、それも必要ありません。たぶん、私は別のテーブルを作成する必要があります。ここで、は外部キーであり、テーブルのIDとして機能する追加の列が1つあります。そして、すべての列が主キーになります。ただし、問題は、余分な列()があるため、これらの3つの列がまだ繰り返される可能性があることです。たとえば、同じ、ただし異なるものを使用できます。これにより、テーブルの4列の複合キーのために行が有効になります(subgradeid_classstudent_idcombination_idgradesubgradeid_classcomb_idcomb_idgradesubgradeclass_idcomb_idcombination_id)。

要するに、私はテーブルの唯一の主キーであり続けたいが、とstudents_idのユニークな組み合わせである別のテーブルへの外部キーになりたいのです。gradessubgradeclass_id

よくわからない場合は、下のコメント欄に質問して、よろしくお願いします。

PSわかりにくいタイトルで申し訳ありませんが、名前を付けるのが苦手です

編集1: より明確にするために: grade1から12 subgradeにすることができますaからjに id_classすることができます1から30にすることができますそしてそれはクラスのあなたの数です

したがって、生徒は7bクラスの生徒であり、クラスの数は-5です。

4

3 に答える 3

27

一意のキー主キーの概念を混同しないでください。との 3 つの列にまたがる一意のキーを追加できます。そうすれば、2 つの行がこれら 3 つの列に対して同じ値を持つことはありません。これら 3 つを複合主キーとして使用したくないとおっしゃっているように、複合一意補助キーの方が優れているかどうかはわかりません。そうでない場合は、複合キーがいつ受け入れられるかを明確にする必要があります。gradessubgradeclass_id

一意のキーを作成するには、次の SQLステートメントを使用できます。

ALTER TABLE students ADD UNIQUE gsc (grades, subgrade, class_id);

そこにあるという言葉gscは、キー列のイニシャルから私が作った名前です。EXPLAIN出力などでキーを識別したい場合を除き、ほとんど問題にならないので、任意の名前を使用してください。

于 2012-08-02T08:43:51.817 に答える
3

なぜあなたが説明したものが欲しいのか完全にはわかりませんが、モデルを次のように見ていきます...

あなたには学生がいます
- 彼らは他のエンティティの複合体ではなく、別個のエンティティです
- 彼らは独自のプロパティを持っています。名前、生年月日など

あなたはクラスを持っています
- これらは学生のグループです
- 学年ごとに同じ「クラス」に異なる学生がいます
- 彼らはまた独自のプロパティを持っています。グレード、サブグレードなど

あなたのモデルには、通常は使用しない追加のプロパティがあります。
クラスに 20 人の生徒がいる場合、それぞれの生徒は 1 から 20 までのセカンダリ ID で識別されます。


これにより、次のディメンションテーブルが得られます

Student                  Class                     Grade              SubGrade
-----------------------  ------------------------  -----------------  -----------------
id          INT PK       id           INT PK       id    INT PK       id    INT PK
first_name  VARCHAR(45)  name         VARCHAR(45)  name  VARCHAR(45)  name  VARCHAR(45)
last_name   VARCHAR(45)  grade_id     INT FK       desc  VARCHAR(45)  desc  VARCHAR(45)
etc, etc                 subgrade_id  INT FK       etc, etc           etc, etc

Classテーブルには一意の制約があり、1(grade_id, subgrade_id)つのクラスだけが7b.

次に、ファクト テーブルを使用して学生をクラスに関連付ける必要があります...

Class_Membership
-----------------------
id               INT PK
student_id       INT FK
class_id         INT FK
academic_year    INT

学生がどの学年でも 1 つのクラスにのみ所属する必要がある場合は、一意の制約を に設定し(student_id, academic_year)ます。

Classまたは、テーブルに学年を含めることもできます。これは、毎年同じクラスが繰り返されることを意味しますが、一部の年にはクラス7gが存在しない可能性があります(たとえば、その年の生徒数が少ないため)

同様に、年度途中から転校7bする学生もいます。7cその場合、Class_Membershipテーブルにはフィールドがstart_dateあり、場合によってはフィールドもある可能性がありend_dateます。


ただし、id_classフィールドを直接作成するものはありません(20 人の生徒がいるクラスの場合は 1 ~ 20)。個人的には、そのようなフィールドはありません。テーブルのidフィールドClass_Membershipは、同じ機能のほとんどを提供でき、おそらく追加の機能を提供できます。ただし、必要な場合は、単純にテーブルに追加できますClass_Membership...

Class_Membership
-----------------------
id               INT PK
student_id       INT FK
class_id         INT FK
academic_year    INT
class_member_id  INT

次に、一意の制約を設定することもできます(academic_year, class_id, class_member_id)


正確な現実世界のモデルと特定のニーズに応じて、ここには非常に多くの柔軟性があります。しかし、うまくいけば、この例はあなたにとって良いスタートです。エンティティをリストするディメンション テーブル、およびこれらのエンティティを関連付けるファクト テーブル (または複数のテーブル)、および/またはエンティティをさらに説明するテーブル。

于 2012-08-02T09:46:10.587 に答える
-1
alter table <TableName> add constraint <ConstraintName> unique(<col1>, <col2>)

Modified the answer due to syntax mistakes. Mentioned above is correct.
于 2016-03-31T05:11:54.153 に答える