Relational-Theory

關係代數中聯合運算產生關係的主鍵

  • October 4, 2015

我對關係代數中聯合操作的結果表/關係有疑問。結果關係沒有主鍵嗎?或者它是否返回一個帶有隱藏主鍵的表?

範例:假設我們取以下兩個表的並集:

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 聲稱擁有它們,但不確定它們有多好或有什麼限制。

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