2012-02-15 53 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