Database-Design

數據庫管理系統 vs 數據庫 vs 表 vs 文件

  • November 13, 2020

我一直在嘗試了解數據庫系統的工作方式。通過網際網路探勘,我得到了以下圖片。

  1. 需要數據庫系統是因為我們需要一種方法來儲存數據,主要是大規模的,以便我們可以輕鬆地對其進行更新、查詢、刪除、操作以及執行其他操作。傳統的文件系統不是為此而設計的,無法達到目的。
  2. 我們可以通過不同的方式實現上述數據庫系統,從而導致不同的數據模型,RDBMS 是最主要的一種。
  3. 有一個數據庫管理系統,它是一個軟體,有點像文件管理系統,它管理數據的創建、刪除、插入等請求。SQLite。
  4. 我們使用數據庫管理系統提供的介面和與數據庫管理系統兼容的語言與數據庫進行互動。例如。SQL。

我希望我到目前為止的理解是正確的。

現在,數據庫管理系統與數據庫互動,我無法理解究竟是什麼數據庫。我以前認為所有表的集合稱為數據庫,只是一個名稱。但後來我發現有幾個可能的數據庫,並且可以像文件一樣使用 DBMS 創建數據庫。進一步的研究表明我數據庫是一個文件。

我的疑問如下:

  1. 如果數據庫是一個文件,它與普通文件有什麼不同(在實現方面)?
  2. 我相信表格也是文件。但是表儲存在數據庫中。一個文件怎麼能在一個文件中,並且兩者都可以被認為是分開的。
  3. 不同數據模型的實現,例如將數據儲存在 rdbms 中的關係,將數據儲存在基於 OOP 的數據庫系統中的對象,它們是在數據庫管理系統還是數據庫中實現的?

如果數據庫不是一個文件,它究竟是什麼?表、數據庫和數據庫管理系統在實現方面是如何相關的?

我試圖找到這些問題的答案,但似乎這些內容並不多,而且我沒有運氣。另外,請解釋它避免非常複雜的程式碼片段,因為我是一個分析

以下是解釋特定 DBMS 如何儲存和檢索數據的自下而上方法的開始。特定的 DBMS 是 Oracle-RDB,以前稱為 DEC RDB/VMS。這是與 Oracle-RDBMS 不同的產品,Oracle-RDBMS 是每個人都知道和喜愛(或不喜愛)的產品。

數據庫文件由一個主文件和幾個儲存區文件以及幾個快照文件組成。快照文件包含保存數據庫虛擬快照所需的數據,以便長時間執行只讀事務。我現在將忽略這些文件。

主文件包含 DBMS 定位和使用儲存區文件以及快照文件所需的資訊。

每個儲存區域被劃分為所謂的“數據庫頁面”。名稱“頁面”可能會產生誤導,因為這與 CPU 內的記憶體映射器管理的記憶體頁面不同。但是,數據庫頁面大小始終是記憶體映射器中的頁面大小和文件系統中的磁碟塊大小的倍數。

單個儲存區域中的所有數據庫頁面大小相同,但不同儲存區域之間的大小可能不同。

每頁分為幾行。線通過線索引定位。每個索引條目都包含一個字節偏移量和一個行大小(以字節為單位)。字節偏移量是從頁面的開頭。

一行可能包含: 一個表格行;一個索引節點;一個雜湊桶;或 DBMS 需要的幾種資料結構中的任何一種,以便管理儲存區域內的可用空間等。

對於使用某種程式語言和 SQL 編寫應用程序的應用程序開發人員來說,所有這些結構都是完全不透明的。程序員根本不需要知道這些東西。數據庫建構者可能會受益於了解這些內容以建構高性能數據庫。

組成表的各行不必在儲存區域中彼此相鄰。一個表甚至可以跨儲存區域進行拆分,數據庫建構者利用這一事實來提高多使用者數據庫的性能。

DBMS 可以相當快地定位給定表的所有行,但是在許多情況下,對大表的完全訪問仍然是性能災難。這是最後的手段。大多數數據訪問是通過索引和/或雜湊桶完成的。索引提供了一種將鍵控訪問轉變為直接訪問的非常快速的方法。

索引條目提供的訪問資訊由儲存區域號、儲存區域內的頁號和頁內的行號組成。有了這些資訊,DBMS 可以快速找到構成數據庫頁面的文件塊,並將該頁面放入記憶體。然後,它可以使用行號和行索引快速定位頁面內的行。

所有這些似乎都與程序員使用 SELECT 語句發出的 SQL 無關。我所說的所有內容都與建構一個平台有關,在該平台上,DBMS 可以定位和檢索 SELECT 語句所需的數據。但這個故事比我所說的要多得多。我剛剛開始摸索表面。

RDB 內置了一個基於成本的查詢優化器,該優化器幫助 DBMS 在幾個等效的檢索策略中選擇可能需要最少磁碟 I/O 操作的策略。

這就是我現在要嘗試寫的全部內容。如果你有興趣自學,這裡有一個連結: http: //neilrieck.net/docs/openvms_notes_rms_rdb.html#rdb

但是,如果我是你,我會花更多時間嘗試學習 Oracle RDBMS 的內部結構,它的組織方式有些不同。此外,另一個主要競爭者 SQL Server 的內部結構。還有其他重要的參與者,如 Postgres 等。

祝你好運。


附錄

值得一提的是數據庫內部的一個資料結構。這是數據字典。這是儲存在數據庫中的數據定義儲存庫。當數據庫建構器使用 CREATE、ALTER 和 DROP 命令創建數據庫及其內容時,DBMS 以儲存在數據庫中的元數據的形式記錄其活動。這被稱為數據字典,使用行業廣泛的說法。Oracle-RDB 使用術語“系統關係”。這實際上是第二個數據庫,DBMS 在其中與自己共享數據定義。每個表名、列名和儲存區域名都儲存在這裡,還有很多其他的東西。DBMS 將在稍後的某個時間點需要它,當它解析來自程序員或 DBA 的 SQL 時。它還可以用於提取創建腳本以創建一個新數據庫,其中沒有任何數據,但具有當時的定義。自我描述數據是任何真實數據庫系統的關鍵要素。

(感謝 Shaheed Haque 的回答,這讓我想起了這一部分。他的回答與此相反,因為 Shaheed 採用了自上而下的方法來描述 DBMS 的內部結構。)

可能還會有更多。

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