Database-Internals

是否有任何 RDBMS “內聯” 1:0-1 關係的依賴表?

  • April 4, 2022

在主表和從屬表1:0-1之間存在關係的情況下,當常用查詢將從兩者中讀取時,內聯執行任何 RDMB以消除單獨儲存的需要(並維護的索引和其他成本)。p``d``p``d``d``d``d

我想引用 Codd 的論文,他建議表可以是完全抽象的——而現在我不知道有任何 RDBMS 將表視為抽象;他們都將 SQLTABLE對象視為磁碟上行儲存結構的 1:1 表示(這樣兩個 SQLTABLE對象(共享一個 PK)不能共享一個行儲存,也不能使用多個行儲存來表示一個TABLE……除了SQL PARTITION,當然)。

因為肯定 SQLTABLE關係對象旨在作為一種抽象,並且 RDMBS 可以自由選擇最合適的磁碟表示,其中可能包括內聯依賴表,引用 Codd:

https://www.seas.upenn.edu/~zives/03f/cis550/codd.pdf

第 1 節中描述的數據的關係視圖(或模型)似乎在幾個方面優於目前在非推理系統的流行。它提供了一種僅以其自然結構來描述數據的方法,即不為機器表示目的而疊加任何額外的結構

例如:

CREATE TABLE principal (
   principalId int         NOT NULL IDENTITY,
   foo         varchar(50) NOT NULL,
   bar         bigint      NOT NULL,

   CONSTRAINT PK_principal PRIMARY KEY ( principalId )
);

CREATE TABLE dependent (
   principalId int         NOT NULL,
   baz         varchar(50) NOT NULL,
   qux         bigint      NOT NULL,

   CONSTRAINT PK_dependent PRIMARY KEY ( principalId ),
   CONSTRAINT PK_dependent_to_principal FOREIGN KEY ( principalId ) REFERENCES principal ( principalId )
);

上面可以認為等價於:

CREATE TABLE principal (
   principalId int         NOT NULL IDENTITY,
   foo         varchar(50) NOT NULL,
   bar         bigint      NOT NULL,

   d_baz       varchar(50)     NULL,
   d_qux       bigint          NULL,

   CONSTRAINT PK_principal PRIMARY KEY ( principalId ),

   CONSTRAINT CK_dependent CHECK (
       ( d_baz IS     NULL AND q_qux IS     NULL )
       OR
       ( d_baz IS NOT NULL AND q_qux IS NOT NULL )
   )
);

…這可能會具有更好的 DML 性能,因為它必須只維護PK_principal索引,而不是在PK_principal 添加 或刪除數據PK_dependent時進行索引。dependent

這也意味著並發應用程序不需要在事務期間對多個表進行鎖定,並保持鄰近位置,我認為這將極大地提高性能。

據我所知,最常見的不會自動執行此操作,並且可能是有充分理由的。您的問題是假設人們總是想查詢兩個表之間的所有列。如果是這樣的話,為什麼還要從兩張桌子開始呢?

這也意味著並發應用程序不需要在事務期間對多個表進行鎖定” - 是的,但是在單個“內聯”表上鎖定的時間將大致成比例地延長,因為需要讀取更多數據從磁碟,寫入記憶體,然後並發處理。事實上,在某些情況下,一個執行時間較長的事務的整體性能可能比兩個較短的鎖更差。

保持最近的局部性,我認為這將極大地提高性能” - 對於現代硬體和現代數據庫系統以及如何儲存和定位數據,這是一個有爭議的問題。與數據管理和查詢的常見瓶頸相比,我懷疑最近的位置會產生任何明顯的差異。

兩表版本(p 和 d)是邏輯級別上唯一可能的關係正確版本。雖然 Codd 在他的一生中都極力提倡將空值作為解決“失去數據”問題的解決方案,這與他的關係模型完美契合,但如今幾乎普遍(可能不是在編碼人員中,而是在數據庫專業人士中)認為是他最大的錯誤。

Codd的主要目標一直是實現物理數據獨立,即邏輯層和物理層的關注點分離。這一目標成為現實的程度直到今天仍然幾乎完全可以忽略不計。

這是 Codd 在他 1990 年關於 RM/V2 的書中:

在 1960 年代後期,我決定仔細研究數據庫是如何設計的。那時我很清楚,不存在任何可以建立數據庫設計的工程學科。一個結果是,設計師發現解釋他們選擇特定設計的原因極其困難——而且通常是不可能的。對我來說似乎有意義的唯一原因是在開髮用於在數據庫上執行的第一個應用程序上獲得了可接受的性能。當然,這通常意味著數據庫設計與在後續開發的應用程序中獲得良好性能不一致。兩個主要問題和挑戰出現了。第一的,完全不關心數據庫作為一個對象,它將繼續存在和發展,獨立於任何可能在某個時刻存在的應用程序集合。其次,數據庫設計沒有合理的基礎,因為在足夠高的抽象層次上沒有精心構思的概念。如果唯一可用的概念是位和字節,則無法成功地進行數據庫設計。

“表格”(實際上是關係)確實應該是“完全抽象的”,但它們從來都不是,原因主要與證明想法的概念/可行性的壓力有關(例如,以 IMS 為生的 IBM 員工有長期以來一直是 Codd 最激烈的對手),導致人們採取某些捷徑並做出某些不那麼有根據的假設,例如假設 1-1 映射到文件中的物理記錄。有傳言說,當 IBM 管理層最終確信 RM 的可行性時,Codd 說“現在回去設計一個像樣的語言”,管理層回答說“我們有一種語言,我們將使用它並在此基礎上進一步發展它”。剩下的就是歷史 …

你確實陳述了一些與物理設計級別和鎖定策略有關的事情,這些事情現在有點可疑。例如,LOB 屬性永遠不會成為“包含它們的行的 1-1 表示”的一部分。鎖通常是頁級鎖,有時是行級鎖,但很少是表級鎖。

我確實相信“鄰近位置”仍然是提高性能的主要技術(如果 DBMS 完全支持它,實際上他們大多不支持的話),但收益肯定比他們過去使用舊的要小得多硬體。

並且“DBMS 應該可以自由選擇最合適的磁碟表示”是對 DBMS 可以做什麼的巨大高估。做出這樣的選擇需要數據來作為這些選擇的基礎。現實情況是,即使是 DBMS 設計人員也根本沒有完整的資訊模型來說明該過程中涉及的數據類型……

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