次のデータベースがあります。最初のテーブルusersはユーザーを含むテーブルで、useridは主キーです。
次は私の結果テーブルです。これで、各ユーザーについて、IDを使用した結果が得られ、試験に反対する可能性があります。このシナリオでは、「id」を主キーとして使用し、「userid」を外部キーとして使用しても大丈夫ですか?このシナリオをモデル化するためのより良い方法はありますか?
次に、これらは対応する試験にリンクします...
次のデータベースがあります。最初のテーブルusersはユーザーを含むテーブルで、useridは主キーです。
次は私の結果テーブルです。これで、各ユーザーについて、IDを使用した結果が得られ、試験に反対する可能性があります。このシナリオでは、「id」を主キーとして使用し、「userid」を外部キーとして使用しても大丈夫ですか?このシナリオをモデル化するためのより良い方法はありますか?
次に、これらは対応する試験にリンクします...
私はおそらくuserid
として持っていないでしょうvarchar
。私もそれを持っているでしょうint
。
したがって、ユーザーテーブルは次のようになります。
userId int
userName varchar
firstName varchar
lastName varchar
そして、結果テーブルテーブルのフォアキーは。になりますint
。このような:
userId int
result varchar
id int
examid INT
JOIN
テーブルを一緒にプレイしている場合は、テーブルをプレイするのは、テーブルをプレイJOIN
するよりもvarchar
速くないためです。JOIN
INT
編集
これは、保存する予定のデータの量によって異なります。あなたは、GUID
sがユニークではない最小限のちゃんがいることを知っています。GUIDが一意ではないことの簡単な証明。このデータベースを設計する場合は、intを使用すると思います。GUID
をユーザーIDとして使用するのは少しやり過ぎだと感じるので
各ユーザー/試験で1つの結果しか生成されない場合は、結果テーブルのuserid
とexam
列を使用して複合キーを作成できます。
id
個人的には、レコードを参照するためにいくつかの値を渡す必要がないので、任意のフィールドアプローチを使用します。しかし、それは私だけです:)。
また、exam
結果テーブルのフィールドも外部キーである必要があります。
これを行う別の方法は、試験から成績レベルを抽象化し、試験を独自のテーブル上の一意のエンティティ(および主キー)にすることです。したがって、これにより、グレードが2番目のテーブルの外部キーとして機能するグレードレベルテーブル(pkey1 = A、pkey2 = Bなど)が作成され、フィールド全体が削除されます。
また、別のレベルを正規化して、Subjectsのテーブルを作成することもできます。これは、専用のExamCodeテーブルの外部キーになります。試験にはENG101、ENG102などを使用でき、対象の他の試験コードにも同じものを使用できます。これの利点は、試験、科目、学生、および成績レベルを一意のエンティティとして維持することです。それぞれの主キーと外部キーは明らかであり、スケールアップの余地がある簡単なメンテナンスの将来を維持します。
複合キーの使用を検討することもできますが、これは開始するのに便利で簡単な方法であり、必要に応じてテーブルをマージしてインデックス作成と圧縮を行うことができます。
スキーマを実際に正規化する前に、まず正規化フォームを理解していることを確認してください。