2017-09-25 49 views
1

我試圖更好地理解SQL在實踐中的工作原理。 它是否將重複記錄作爲附加參數(表示多重性)存儲到記錄中?或者,我們是否簡單地向表中添加另一個重複記錄?或者,還有其他一些方法?我很好奇大多數SQL發行版。SQL實現如何在內部存儲重複記錄?

例如,假設我們有關係R(A,B,c)與整數屬性,我們可以如下存儲在內部:

Integer-a Integer-b Integer-c Multiplicity 
1   2   3   2 

備選地

Integer-a Integer-b Integer-c 
1   2   3 
1   2   3 

回答

3

SQL不以重複的方式存儲重複的記錄(至少沒有我熟悉的數據庫引擎)。

每條記錄​​佔據自己的空間。通常,記錄與其他記錄一起存儲在頁面上。這些是數據庫使用的I/O單元。

這就是說,有一些注意事項。例如,列式數據庫獨立存儲每一行​​。存在壓縮技術,其中相鄰值將以多重因子存儲。這不完全是你的建議,但它是沿着同樣的路線。

如果你想了解數據庫是如何工作的,我建議你選擇一個並研究它。 MySQL有一個非常簡單的模型(但是由於存儲層與處理層分離的事實而變得複雜)。 Postgres和SQL Server在其頁面佈局和存儲引擎上也有合理的文檔。

+0

我很驚訝它的作品是這樣的!特別是當有行李如十字路口時。在最壞的情況下,O(m)空間與O(1)空間。 – Daniel

+2

@丹尼爾。 。 。不要認爲任何真正的數據庫都是關係模型的學術純粹實現。最好說關係代數啓發了SQL。反過來,真實世界的實現受到更多世俗考慮的深刻影響。也許,關係代數是任何給定數據庫的DNA,但其實現更多地受到環境因素的影響。 –

+0

還要注意,現在重複數據刪除經常發生在文件系統或更低級別 – Gnudiff

1

我不認爲SQL引擎使用多重性。這背後的原因是,爲了使用多重性(您在問題中定義它的方式),2或多於2行應該是相同的。

現在不會是像Oracle發動機的情況下,因爲Oracle隱式添加ID來叫ROW_ID每一行,這將是每行獨特的,可以用它來識別整行和它的實際/物理存儲位置。至於重複進入列內,我猜測除了列被定義爲主鍵或者列上存在唯一約束之外,不會有列內值的檢查/比較(插入數據時)。

希望它有幫助!