Postgresql
如何使用外鍵?
我正在創建下表:
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表的標識符欄位中。這消除了模棱兩可的數據並簡化了維護。