簡體   English   中英

不同表上的外鍵

[英]Foreign key on different tables

我有一張圖片表:

圖片

  • image_id
  • image_type('foo','bar')
  • type_id

我如何創建外鍵,如果image_typefootype_id應該與foo表相關,如果image_typebarbar表。

您想要做的是創建一個超類型。 在SQL中,最好像下面這樣建模(至少是IMO)。 如果語法不適用於MySQL,我深表歉意。 我通常使用MS SQL Server。

CREATE TABLE Image_Types (
    image_type_id INT NOT NULL,
    image_type    CHAR(3) NOT NULL CONSTRAINT CHK_Image_Types_image_type CHECK (image_type IN ('Foo', 'Bar')),
    CONSTRAINT PK_Image_Types PRIMARY KEY (image_type_id, image_type)
)

CREATE TABLE Foo (
    image_type_id            INT          NOT NULL,
    image_type               CHAR(3)      NOT NULL CONSTRAINT CHK_Foo_image_type CHECK (image_type IN ('Foo')),
    some_foo_specific_column VARCHAR(100) NOT NULL,
    CONSTRAINT PK_Foo PRIMARY KEY (image_type_id),
    CONSTRAINT FK_Foo_ImageTypes FOREIGN KEY (image_type_id, image_type) REFERENCES Image_Types (image_type_id, image_type)
)

CREATE TABLE Bar (
    image_type_id            INT          NOT NULL,
    image_type               CHAR(3)      NOT NULL CONSTRAINT CHK_Bar_image_type CHECK (image_type IN ('Bar')),
    some_bar_specific_column VARCHAR(100) NOT NULL,
    CONSTRAINT PK_Bar PRIMARY KEY (image_type_id),
    CONSTRAINT FK_Bar_ImageTypes FOREIGN KEY (image_type_id, image_type) REFERENCES Image_Types (image_type_id, image_type)
)

CREATE TABLE Images (
    image_id      INT NOT NULL,
    image_type    CHAR(3) NOT NULL CONSTRAINT CHK_Images_image_type CHECK (image_type IN ('Foo', 'Bar')),
    image_type_id INT NOT NULL,
    CONSTRAINT PK_Images PRIMARY KEY (image_id),
    CONSTRAINT FK_Images_ImageTypes FOREIGN KEY (image_type_id, image_type) REFERENCES Image_Types (image_type_id, image_type)
)

如果RDBMS支持,則另一種方法是在Image_Types上使用過濾的索引視圖,然后將FK放在Foo並將Bar指向這些視圖。 這使您可以從某些表中消除image_type列。 即使過濾索引視圖可用,有些人還是喜歡上面的模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM