使用单个属性作为子类型中的主键和外键 table

Using a single attribute as both a primary key and a foreign key in a subtype table

我有一个名为 Card 的超类型 table(来自 ERD),这个 table 有两个子类型:Credit CardDebit Card。我的 table Card 中有一个 Primary Key 名为 CardID

如果我将CardPrimary Key同时指定为Credit CardDebit Card的外键和主键是否正确?

如何将超类型 table 的主键导入其子类型(代码)?我只是这样做吗?

CREATE TABLE [Credit Card] (
    CreditCardNumber varchar(50) NOT NULL Primary Key,
    CreditCardNumber varchar(50) NOT NULL Foreign Key REFERENCES Card(CardID)
)

Doc\SQL\T-SQL

CREATE TABLE [Credit Card] (
    CreditCardNumber varchar(50) NOT NULL Primary Key,
    Foreign Key (CreditCardNumber) REFERENCES Card(CardID)
)

如果信用卡 table 在结构上与借记卡有很大不同,我想按照您描述的方式制作钥匙是有意义的。您必须自己权衡此解决方案是否比仅拥有一张包含信用卡或借记卡所有字段的卡table更好。

正如 GuidoG 所说,您编写查询的方式就像是说您有两个同名的不同列。你想要这样的东西:

CREATE TABLE [Credit Card] (
    CreditCardNumber varchar(50) NOT NULL Primary Key,
    ....(other cols)....,
    CONSTRAINT FK_CreditCard_Card Foreign Key (CreditCardNumber) REFERENCES Card(CardID)
)

我想补充一点,你想知道最佳解决方案的本质可能与 "polymorphic associations" 密切相关,请仔细检查一下。

回应您的评论:您所说的唯一正确的是"but"这个词。您似乎已经想到,如果列既是 PK 又是 FK,则为 "strange";它不是。它们是两个完全不相关的东西,SQL 服务器根本不在乎。 PK 确保每一行在此列中具有不同的值。 FK 确保该值必须存在于另一个 table 的列的可能值中。完全没有冲突;除了可能的 philosophical/design 冲突,这当然只发生在您的脑海中(而不是 sql 服务器的结构),并且我的回复(和许多其他人的回复)已经涵盖了。

我猜你想要这样的东西

create table dbo.[Credit Card] (
  CreditCardNumber varchar(50) not null,
  other columns ...

  constraint PK_CreditCardNumber primary key (CreditCardNumber),
  constraint FK_CreditCard_Card foreign key (CreditCardNumber) references Card(CardID)
)

仅当 table Card 中的列 CardID 与 table [=17= 中的 CreditCardNumber 列具有相同的定义时才有效]
仅从名称来看,情况可能并非如此?

大多数时候最好只使用一个判别器字段table。
例如

create table dbo.Card (
   CardNumber varchar(50) not null,
   CardType char(1) not null check (CardType in ('C', 'D')),

   CreditCardColumn1 varchar(50) null,
   CreditCardColumn2 varchar(50) null,

   DebitCardColumn1 varchar(50) null,

   constraint PK_CardNumber primary key (CardNumber),
)

检查约束将确保只有 CD 可以存储在此列中。
信用卡和借记卡的两列都必须放入此 table。 您为每种类型编写的查询应该不同,table 将始终相同

现在,当您需要所有信用卡时,只需这样做

select c.CardNumber,
       c.CardType,
       c.CreditCardColumn1,
       c.CreditCardColumn2
from   dbo.Card c
where  CardType = 'C'

对于所有借记卡,只需执行

select c.CardNumber,
       c.CardType,
       c.DebitCardColumn1
from   dbo.Card c
where  CardType = 'D'