Relational-Theory
關係代數中聯合運算產生關係的主鍵
我對關係代數中聯合操作的結果表/關係有疑問。結果關係沒有主鍵嗎?或者它是否返回一個帶有隱藏主鍵的表?
範例:假設我們取以下兩個表的並集:
R1: id | name ---------- 1 a 2 b 3 c R2: id | name ---------- 1 b 2 c 3 d
其中屬性“id”是關係 R1 和 R2 中的主鍵,現在這兩者的聯合將是:
id | name ------------ 1 a 1 b 2 b 2 c 3 c 3 d
現在,結果關係中的所有屬性都不能是主鍵,因為 id 和 name 都包含重複項。DBMS 如何解決這個問題?
根據定義,兩個關係的並集不包含重複項。所以它至少包含一個候選鍵,所有屬性的組成。在您的範例
(id, name)
中是候選鍵。DBMS 不會通過分配主鍵來“解決”問題,因為在幾乎所有 DBMS (至少那些使用 SQL 的 DBMS)中,兩個表的聯合是派生表(或視圖或 CTE,但不是基表)並且主鍵(1)*只能為基表定義(不能用於視圖、不能用於派生表和不能用於公用表表達式)*。
儘管如此,DBMS 優化器通常會意識到,從聯合生成的派生表沒有重複項,並且所有屬性的組合唯一地定義了一行,並且可以在對錶的後續操作中使用這一事實*(例如,在更複雜的查詢中聯合加入或聯合其他表)*。
(1) : 和一般的約束。有一個通用的 SQL 約束構造
CREATE ASSERTION
(Firebird 聲稱擁有它們,但不確定它們有多好或有什麼限制。