2012-02-15 14 views
1

私は3つの列を含むBooksという名前のテーブルを持っています。SQL Serverの複合外部キー

TableName: Books 
Columns: BookId (PK), BookName, Book_Publisher_XRef_Id (FK), IsInternal 

私は出版社情報を含む2つのテーブルを持っています。これらのテーブルの両方には、異なる列のセットがあります。

TableName: InternalPublishers 
Columns: PublisherId (PK), PublisherName, .... 

TableName: ExternalPublishers 
Columns: PublisherId (PK), PublisherName, .... 

どの書籍がどの出版社に属しているかに関する情報を含むリンクテーブルがあります。 1つの本は複数の出版社を持つことができます。

TableName: Books_Publishers_XRef 
Columns: Book_Publisher_XRef_Id (PK), PublisherId 

私は発行者IDの外部キー制約を作成したい場合は、私が作成できることを確認していないコンポジット外部キー制約のようなものを作成する必要があります。

このシナリオでは、BooksPublishers_XRefテーブルのPublisherIdでFKを達成する最も良い方法は何ですか? 2つのテーブル、すなわち内部出版用と外部出版社のための別のものとしていBooks_Internal_Publishers_XRefとBooks_External_Publishesr_XRefテーブルのための本テーブルの2列の

  1. ブレークBooks_Publishers_XRefテーブル?

  2. Publisher_Id列にFKを作成せずにそのまま使用しますか?

  3. Publisher_Type_Id = 1の場合、それはInternal_PublishersテーブルとPublisher_Type_Id = 2に属し、それはExternal_Publishersテーブルに属する書籍テーブルとBooks_Publishers_XRefテーブルにPublisher_Type_Id列を追加することにより、複合FKを作成しますか? (これが可能かどうか分かりません)

  4. 他のスキーマ設計ですか?

助言してください。

+0

あなたが本当に出版社のための2つのテーブルが必要ですか? 1つのテーブルと、それが内部か外部かを指定する1つの追加の列を持つことができます。 –

+0

彼らは両方ともフィールドが異なっていて、ShudがPublisherTypeに基づいてNULLのフィールドの一部に値を残しているかどうかわからない – Asdfg

+1

1つのPublisherテーブルと1つのテーブルを持つことができます各パブリッシャタイプのフィールド –

答えて

1

データを2つのテーブルに分割しないでください。InternalPublishersExternalPublishers。 1つのテーブルを作成し、内部か外部かを決定するフィールドをbitにします。このようなもの:

create table Publisher 
(
    PublisherId int not null primary key clustered, 
    PublisherName varchar(100) not null, 
    IsInternal bit not null 
) 
go 

このようにすれば、外部キー参照を簡単に作成できます。結局のところ、あなたはBooksのこの同じデザインを持っているように見えます。それを出版社に行ってください。

+0

パブリッシャテーブルのフィールドは、両方のテーブルで同じではありません。私は出版社のタイプに基づいてそのテーブルにNULL値をたくさん持っています – Asdfg

+1

あなたは決して、*いつでもパブリッシャーの追加のタイプがあることを知っている場合は、それをビット列にしてください。 (また、問題の可能性があるビット列をインデックスに登録することはできません) –

+2

クラシックタイプ/サブタイプの問題です。パブリッシャー用の1つの表、次に内部および外部用のサブタイプ表(サブジェクト固有の列を持つ)。他のものは、クルーゼの回避策のようです。 –

1
  • Publisherテーブルにすべての一般的な列を維持します。
  • サブタイプテーブルには、それぞれに固有のカラムしかありません。

enter image description here

+0

ありがとうございます。私は同じようにテーブルを作成しました。 – Asdfg

関連する問題