2013-05-18 34 views
0

是5NF關係的6NF relvar表中所需的主鍵。考慮以下設置:是否需要主鍵? (6NF實現)

-- The 5NF table 
CREATE TABLE party_address(
    address_id int NOT NULL, 
    party_id int NOT NULL, 
    -- some other columns 
    PRIMARY KEY (address_id, party_id) 
); 

CREATE TABLE party_address_is_billing(
    address_id int NOT NULL, 
    party_id int NOT NULL, 
    value boolean NOT NULL, 
    transaction_time tstzrange NOT NULL DEFAULT tstzrange(CURRENT_TIMESTAMP, NULL, '[)'), 
    EXCLUDE USING GIST (address_id WITH =, party_id WITH =, transaction_time WITH &&) 
); 

是否需要顯式聲明的party_address_is_billingPRIMARY KEY?由於排除約束指定了唯一標識符((address_id, party_id, transaction_time)),因此明確指定PRIMARY KEY (address_id, party_id, transaction_time)似乎是多餘的。它也會創建一個額外的和不必要的索引。

  • 沒有在表上指定PRIMARY KEY會產生什麼後果?

回答

2

關係模型要求每個關係都至少有一個關鍵字。它不要求您使用特定的關鍵字。

在你的5NF表中,如果你聲明關鍵字爲not null unique (address_id, party_id),你根本不會改變底層的依賴關係。這就是你必須從關係角度來關注的東西 - 替代的語法不會搞垮潛在的依賴關係。 (這意味着關係模型不關心實現的「額外和不必要的索引」)。

因此,在「party_address_is_billing」中,如果排除約束的行爲像一個關鍵約束,我認爲你很好作爲關係模型而言。

未在表上指定PRIMARY KEY會導致什麼後果?

  1. 如果更換另一種聲明約束的行爲上相同的主鍵約束,你可能會驚訝的維護程序員。請參閱文章Principle of least astonishment

  2. 您可能還會讓框架程序員更加努力地工作。許多框架不僅要求PRIMARY KEY約束,還要求約束是代理整數。 (這不是真正的關係問題。)

  3. 某些軟件工程(CASE)工具可能會阻塞排除約束。

  4. 與違反排除約束的進程相關的錯誤消息可能不如關於違反主鍵約束的錯誤消息清楚。 (這涉及到「1」,上面。)

我不認爲有任何後果只要關係模型而言。 (也就是說,只要用行爲相同的聲明性約束替換主鍵約束)。