我一直在尝试了解数据库系统的工作方式。通过互联网挖掘,我得到了以下图片。
- 需要数据库系统是因为我们需要一种方法来存储数据,主要是大规模的,以便我们可以轻松地对其进行更新、查询、删除、操作以及执行其他操作。传统的文件系统不是为此而设计的,无法达到目的。
- 我们可以通过不同的方式实现上述数据库系统,从而导致不同的数据模型,RDBMS 是最主要的一种。
- 有一个数据库管理系统,它是一个软件,有点像文件管理系统,它管理数据的创建、删除、插入等请求。SQLite。
- 我们使用数据库管理系统提供的接口和与数据库管理系统兼容的语言与数据库进行交互。例如。SQL。
我希望我到目前为止的理解是正确的。
现在,数据库管理系统与数据库交互,我无法理解究竟是什么数据库。我以前认为所有表的集合称为数据库,只是一个名称。但后来我发现有几个可能的数据库,并且可以像文件一样使用 DBMS 创建数据库。进一步的研究表明我数据库是一个文件。
我的疑问如下:
- 如果数据库是一个文件,它与普通文件有什么不同(在实现方面)?
- 我相信表格也是文件。但是表存储在数据库中。一个文件怎么能在一个文件中,并且两者都可以被认为是分开的。
- 不同数据模型的实现,例如将数据存储在 rdbms 中的关系,将数据存储在基于 OOP 的数据库系统中的对象,它们是在数据库管理系统还是数据库中实现的?
如果数据库不是一个文件,它究竟是什么?表、数据库和数据库管理系统在实现方面是如何相关的?
我试图找到这些问题的答案,但似乎这些内容并不多,而且我没有运气。另外,请解释它避免非常复杂的代码片段,因为我是一个分析
开始考虑不同类型存储的高级属性/行为,而不是开始考虑低级细节可能会有所帮助。
例如,可以考虑简单文件(平面、二进制内容)、索引文件(在单个简单文件之上分层的结构化访问),在任何一种情况下都由 OS 级原语提供锁定或不锁定。
在这样的术语中,人们可能会说不同的数据库系统(使用非常松散的术语)可以通过以下方式与文件进行表征和对比:
一种查询语言,用于根据一些复杂的标准读取(在某种程度上,写入)数据。简单文件只能通过文件偏移量读取或写入。索引文件可以有一些标准,但查询语言通常非常简单。
数据库系统中通常存储有多种类型的对象,其元数据结构允许查询语言以统一的方式处理这些对象。对于简单文件和索引文件,您必须自己构建所有这些方面。
数据库系统通常可以通过网络访问,包括锁定语义。网络文件系统层可以公开简单文件,但这样做时锁定语义通常会丢失或更改。我不知道有任何系统(可能是 1980 年代的一些过时系统除外)甚至尝试对索引文件进行此操作。
人们可能会继续对许多其他行为和属性进行这种分析。当您这样做时,您的问题和假设的细节可以针对这些行为和属性得到回答。
当然,许多数据库系统也确实是建立在操作系统提供的简单文件之上的。但这不是给定的——实际上高性能数据库系统也经常使用某种“原始”I/O 来访问磁盘。文件恰好是一种方便的抽象,以避免数据库系统不得不复制操作系统的文件访问层已经完成的许多事情。
以下是解释特定 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 的内部结构。)
可能还会有更多。