2012-04-18 3 views
2

私は次のデータベースを持っています。最初のテーブルのユーザーはユーザーを含むテーブルです.useridはプライマリキーです。次のような外部キーの使用が許容されますか

user table

次現在、ユーザ毎に、IDと結果が存在することができ、それは試験に対してすることができ、私の結果の表です。このシナリオでは、主キーとして "id"を使用し、外部キーとして "userid"を使用するのはいいですか?このシナリオをモデル化するより良い方法はありますか?これらの各ユーザー/試験は、これまで唯一つの結果を生成することを提供

enter image description here

答えて

2

おそらくuseridvarcharとして持っていないでしょう。私はそれをintとしても持っています。

userId int 
userName varchar 
firstName varchar 
lastName varchar 

そして結果テーブルテーブルのforenkeyはint次のようになります。

だから、ユーザーの表は、このようなものです。このように:あなたはvarcharにINGのJOINその後、一緒にテーブルをINGのJOINにplaingされている場合

userId int 
result varchar 
id int 
examid INT 

Becuase早くJOINとして依存INT

EDIT

にINGのではありませんあなたが保存しようとしているデータの量。あなたはGUIDが一意ではない最小の色合いがあることを知っています。 Simple proof that GUID is not unique。私はこのデータベースを設計すれば私はintで行くだろうと思う。あなたがユーザーIDとしてGUIDを使用するにはちょっと不満が感じられます。

+0

私は実際には、intではなく、ユーザーのプライマリキーにGUIDを使用することを検討していました。これは悪い考えですか? – david99world

+0

答えを更新しました – Arion

+2

@ david99world:あなたが良いと思う答えを投票してください。それは私たちにすべて暖かい曖昧な感情を与えます:P – Arion

1

...対応する試験へのリンクを、あなたが使用して複合キーを作成することができ

results table

結果表のuseridおよびexam列。

個人的には、私は任意のidフィールドアプローチを使用しますが、参照レコードに複数の値を渡す必要はありません。しかし、それは私だけです:)。

また、結果表のexamフィールドも外部キーである必要があります。

+0

また、結果テーブルの検査外部キーフィールドの名前を 'examid'に変更して、名前の一貫性を保つことをお勧めします。 – weenoid

1

これを行う別の方法は、試験からのグレードレベルを抽象化し、試験を独自のテーブル(および主キー)にすることです。これは、グレードレベルテーブル(pkey1 = A、pkey2 = Bなど)を作成し、グレードは2番目のテーブルの外部キーとして機能し、フィールド全体を削除します。

また、別のレベルを正常化して、専用の試験コード表の外部キーとなる科目の表を作成することもできます。試験にはENG101、ENG102などを、対象には他の試験コードでも同じことができます。これの利点は、試験、科目、生徒、学年レベルを一意のエンティティとして維持することです。それぞれのプライマリキーと外部キーが明白であり、拡張の余地があるだけで簡単なメンテナンスが可能です。

コンポジットキーの使用を検討することもできますが、これは簡単で始めることができます。必要に応じてインデックス作成と圧縮のためにテーブルをマージすることもできます。

1

実際にスキーマを正規化する前に、まずNormal Formsを理解してください。

+0

ああ、私は結果テーブルの値を別のテーブルに分割して最初の正規形にする必要があります。 – david99world

関連する問題