多列外键,具有硬编码参考值

Multi column foreign key, with hard coded reference value

我有一个 ValidationStatus table,其中包含以下(主键)列:

Attribute   Code
ADDRESS INVALID
ADDRESS REFUTED
ADDRESS STORE
ADDRESS VERIFIED
EMAIL   INVALID
EMAIL   REFUTED
EMAIL   STORE
EMAIL   UNKNOWN
EMAIL   VALID
EMAIL   VERIFIED

是否可以在地址table和这个地址之间建立一个外键?

具体来说,每个地址都有一个验证状态;如果我可以对文本进行硬编码,它将是:

ALTER TABLE dbo.Addresses
    ADD CONSTRAINT FK_Addresses_ValidationStatus
    FOREIGN KEY('ADDRESS', ValidationStatus)
    REFERENCES dbo.ValidationStatus(Attribute, Code)

你不能那样做。解决方案正在改变设计如下:

  1. 向 dbo.ValidationStatus
  2. 添加身份或唯一整数
  3. 创建指向新整数字段的外键

    ALTER TABLE dbo.Addresses
    ADD CONSTRAINT FK_Addresses_ValidationStatus
    FOREIGN KEY(ValidationStatus)
    REFERENCES dbo.ValidationStatus(NewUniqueField)
    
  4. Addresstable添加约束,限制在地址验证范围内。对于此示例,假设您的地址验证是 1、2、3 和 4。因此创建一个检查约束,如

    ALTER TABLE dbo.Address
    ADD CHECK (ValidationStatus in (1,2,3,4))
    

这样你就可以利用外键的好处了。

另一种方法是拥有 2 个不同的状态 table 并使用简单的 FK。

注意:在第一种方法中,如果您有新状态,请记住更改检查约束。

另一种方法是使用字符和数字的组合,如 A1、A2、A3、A4 表示地址状态,E1、E2 等表示电子邮件状态。对于每个新条目,您需要选择一个角色。在这种情况下,您可以拥有一个简单的 FK 而无需多个 tables.