sql-server - SQL Server 中的复合外键

标签 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. Break 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. 一些其他的架构设计?

请指教。

最佳答案

不要将您的数据分成两个表:InternalPublishersExternalPublishers。创建一个表并有一个 bit 字段来确定它们是内部的还是外部的。像这样:

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

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

关于sql-server - SQL Server 中的复合外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9298717/

相关文章:

sql - 获取从星期二到星期一的一周中的数量总和

sql-server-2005 - Reporting Services - 根据报表参数隐藏表格列

sql - 如果结果为 true,则返回列名称

php - 使用 PHP 将数据插入数据库

sql - 帮助数据库结构

php - 购买元素的数据库关系

c# - 将 XML 格式的 SSRS 2005 报告导出为 PDF

sql - 单选查询根据 3 个不同的条件选择 3 个不同的变量

sql - SSIS 存储过程调用

c# - 错误 : 0x1 at XX: Exception has been thrown by the target of an invocation