SQL Server中的复合外键

时间:2012-02-15 18:01:37

标签: sql-server database sql-server-2005 database-design

我有一个名为Books的表,其中包含3列。

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的最佳方法是什么?

  1. 将Books Books_Publishers_XRef表分为2个表,一个用于内部发布者,另一个用于外部发布者,并且Books表中有2列用于Books_Internal_Publishers_XRef和Books_External_Publishesr_XRef表?

  2. 不要在Publisher_Id列上创建FK并保持设计原样吗?

  3. 通过在Books表和Books_Publishers_XRef表中添加Publisher_Type_Id列来创建复合FK,其中如果Publisher_Type_Id = 1,它属于Internal_Publishers表而Publisher_Type_Id = 2,它属于External_Publishers表? (不确定这是否可行)

  4. 其他一些架构设计?

  5. 请告知。

2 个答案:

答案 0 :(得分:1)

请勿在两个表格中划分您的数据:InternalPublishersExternalPublishers。创建一个表并使用bit字段来确定它们是内部还是外部。像这样:

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

这样您就可以轻松创建外键引用。毕竟,您似乎对Books采用了相同的设计,请将其保留给发布商。

答案 1 :(得分:1)

  • 将所有常用列保留在Publisher表中。
  • 子类型表只包含特定于每个列的列。

enter image description here