Postgresql

如何使用外鍵?

  • January 13, 2017

我正在創建下表:

CREATE TABLE fund_identifier
(
   id BIGSERIAL PRIMARY KEY NOT NULL,
   identifier TEXT NOT NULL
);
CREATE UNIQUE INDEX IF NOT EXISTS fund_identifier_pkey ON fund_identifier (id);
CREATE UNIQUE INDEX IF NOT EXISTS fund_identifier_identifier_uindex ON fund_identifier (identifier)

但是,我不確定將標識符用作外鍵的最佳做法是什麼。我應該像這樣使用外鍵的值作為參考:

   CREATE TABLE security_papers (
     id                                        BIGSERIAL,
     fund_identifier                           TEXT,
     as_of_date                                DATE,
         ...
     CONSTRAINT security_papers_fund_identifier_fk FOREIGN KEY (fund_identifier) REFERENCES fund_identifier (identifier)
   }

或者,我應該使用它id嗎?像這樣:

   CREATE TABLE security_papers (
     id                                        BIGSERIAL,
     fund_identifier_id                        BIGSERIAL,
     as_of_date                                DATE,
         ...
     CONSTRAINT security_papers_fund_identifier_fk FOREIGN KEY (fund_identifier) REFERENCES fund_identifier (identifier)
   }

當涉及到規範化規則時,我的猜測是第二種方法。從邏輯上講,我的應用程序需要先查找 id fund_identifier,然後再將任何內容保存在security_papers表中。正確的 ?

但是如果我採用第二種方法,這將被委託給數據庫。使我的應用程序邏輯更易於實現。

請讓我知道您的想法,如果我在這裡遺漏了一些概念。謝謝!

您的表似乎有一個非常好的候選鍵(標識符),但您還創建了一個代理鍵。為什麼?(我不堅持所有表都必須有代理鍵的規則。)

但是,一旦您創建了代理鍵,它通常就是用於引用該表中的行的欄位。即使在導入包含identifier中的文本值的外部數據時,它也會在儲存時轉換為鍵值。

換句話說,幾乎無一例外,您可以找到文本標識符值的唯一位置將是在fund_identifier表的標識符欄位中。這消除了模棱兩可的數據並簡化了維護。

引用自:https://dba.stackexchange.com/questions/160859