2011-05-31 62 views
3

ImはMSSQL 2008のデータベースをモデリングします。データベース:1対多(または1対1)関係

私は4つのテーブルを持っています。

**User** 
userID 
userName 

**NewsCategory** 
newsCategoryID 
newsCategoryName 

**News** 
newsID 
newsText 
newsCategoryID 

**Subscription** 
userID 
categoryID 

私はニュースとカテゴリテーブルの間に外部キーが必要であることを理解しています。しかし、私はその碑文で何をすべきですか?何かを購読することは必須ではありませんが、私はユーザーテーブルとサブスクリプションテーブルの間に外部キーを設定する必要がありますか?

+1

「何かを購読することは必須ではありませんが、ユーザーテーブルとサブスクリプションテーブルの間に外部キーが必要ですか? - はい。 –

+1

これは、サブスクリプションがジャンクションテーブルである多対多の関係と考えられるのでしょうか? – johan

答えて

7

はい、する必要があります。外部キーが使用されていることを確認するには、そのサブスクリプションはの既存のユーザー用に作成されます。外来キーとは、そのユーザーに登録する必要があります。

2

はい、この外部キーは、実際のユーザーIDにマップされていないサブスクリプションが存在しないようにする必要があります。

これはデータの制約として機能します。

2

Subscriptionはリンク(多数)テーブルであり、 "必須ではありません"は、そのユーザーまたはそのユーザーのためになし行を意味します。

のサブスクリプションには1つ以上の行がある場合、外部キーはデータの整合性を強制する必要があります。

注:オプションの親子タイプの関係では、「必須ではない」をキャプチャするためにFK列はNULL可能です。リンクテーブルでは、これは行が存在しないことによって取得されます

0

はい、サブスクリプションテーブルでUserテーブルとSubCriptionテーブルの間に外部キーを追加する必要があります。

外部キー制約は、誤った情報をデータベースに追加することを検証するためのものです。たとえば、サブスクリプションテーブルには、UserテーブルにないuserIDが存在しないようにする必要があります。また、NewsCategoryテーブルにないCategoryIDも存在する必要があります。これらの制約は、ユーザーインターフェイスの終了時に検証を実行しなくても、検証を行います。

0

あなたは良い答えを得ています。別のものを追加しようとしましょう。

サブスクリプションには、サブスクライバとカテゴリの両方が必要です。したがって、これらの列のそれぞれはNULLを許可すべきではありません。 NULLの防止は、外部キー制約と同じではありません。

ユーザーがUSERS表にまだ存在しない場合は、SUBSCRIPTIONSに行を挿入することも不可能です。 CATEGORIESテーブルにカテゴリが存在しない場合は、SUBSCRIPTIONSに行を挿入することは不可能です。これらのルールにサブスクリプションテーブルを強制するには、2つの外部キー制約が必要です。

のALTER TABLEのサブスクリプションは、CONSTRAINT FK_SUBSCRIPTIONS_USERS FOREIGN KEY(ユーザーID)は ALTER TABLEのサブスクリプションがCONSTRAINT FK_SUBSCRIPTIONS_CATEGORIES FOREIGN KEY(区分)がカテゴリー(区分)を参照ADD USERS(ユーザーID)を参照ADD取得任意の値がこのテーブルが既に、他のテーブルに存在するに挿入されていることを確認してください:あなたがテーブルの上に外部キー制約を作成すると

は、データベースエンジンに言って有効です。ところで、制約を作成するための要件は、テーブルで参照される列に固有の制約が有効でなければならないということです。つまり、テーブルです。通常、の参照された列は、テーブルがテーブルの主キーになります。

外部キー制約を作成することで、データベースエンジンに言ってないます:行はこのテーブルに挿入されますことを確認してください。 このテーブルには、まったく行がありません(それは珍しいかもしれませんが)かなり可能です。外部キーの制約は、がに挿入されるの値がのテーブルにあることを確認するだけです。