2012-02-15 82 views
1

我有一個名爲Books的表,其中包含3列。SQL Server中的複合外鍵

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

我有兩個包含發佈者信息的表。這兩個表都有不同的一組列。

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

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

我有一個鏈接表,其中包含有關哪本書屬於哪個發佈者的信息。一本書可以有多個發佈者。

TableName: Books_Publishers_XRef 
Columns: Book_Publisher_XRef_Id (PK), PublisherId 

如果我想創建的publisherId外鍵約束,我需要建立某種這我不知道可以創建複合外鍵約束。

因此,在這種情況下,在Books_Publishers_XRef表中的PublisherId上實現FK的最佳方法是什麼?在2個表,即一個內部出版商,另一個用於外部出版商,並有2列在書籍表Books_Internal_Publishers_XRef和Books_External_Publishesr_XRef表

  1. 歇Books_Publishers_XRef表?

  2. 不要在Publisher_Id列上創建FK並將設計保持原樣?

  3. 在書籍表和Books_Publishers_XRef表,如果Publisher_Type_Id = 1,它屬於Internal_Publishers表和Publisher_Type_Id = 2,其中加入Publisher_Type_Id柱創建複合FK,它屬於External_Publishers表? (不知道這是可能的)

  4. 其他一些架構設計?

請指教。

+0

你真的需要出版商兩個表?你可以有一個表和一個額外的列指定它是內部的還是外部的。 – 2012-02-15 18:04:46

+0

他們都有不同的領域,我不知道我是否在某些字段中留下值作爲基於PublisherType的NULL – Asdfg 2012-02-15 18:06:27

+1

您可以有一個發佈商表格和兩個與發佈者1:1關係包含特定每個發佈者類型的字段。 – 2012-02-15 18:09:07

回答

1

不要將您的數據分爲兩個表格:InternalPublishers,ExternalPublishers。創建一個表,有一個bit場確定器,無論是內部還是外部。類似這樣的:

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

這樣你就可以輕鬆地創建你的外鍵引用。畢竟,你似乎有Books這個相同的設計,繼續發行商。

+0

發佈者表中的字段對於兩個表都不相同。根據publishertype,我將在該表中創建大量的NULL值 – Asdfg 2012-02-15 18:08:45

+1

只有在知道永遠不會有的時候,才能使其成爲一個列,*永遠*有一天會成爲其他類型的發佈者。 (另外,您不能對位列進行索引,這可能是個問題。) – 2012-02-15 18:10:30

+2

經典類型/子類型問題。一個發佈者表,然後子類型表(具有主題特定列)用於內部和外部。其他任何東西看起來都像是一團糟。 – 2012-02-15 18:13:07

1
  • 保留Publisher表中的所有常用列。
  • 亞型表有具體到每一個僅列。

enter image description here

+0

感謝您的意見。我以同樣的方式創建了表格。 – Asdfg 2012-02-15 21:26:01