在 EF Codd 于 1970 年发表他的论文“大型共享数据库的数据关系模型”之前,层次结构和网络是数据库的两个突出模型。
他们到底有什么问题没有获胜?
到目前为止的答案涵盖了网络和层次模型最终被关系模型(包括 SQL 数据库系统)取代的许多实际原因。Codd 1970 年的论文详细解释了为什么需要新模型。这是一本很棒的书。事实上,在 Codd 之前,“数据模型”这个词实际上是闻所未闻的。因此,他创造了术语“层次模型”和“网络模型”来描述在没有精确模型的情况下构建的数据库系统。
层次模型和网络模型可以统称为“图模型”。数据图模型的本质特征是数据项通过说明它们的位置来引用。如果您了解指针,您就会了解有关图模型的所有基础知识。
数据图模型有两个非常强大的优势。首先是程序员很容易掌握。新手程序员通过一定的学习曲线来掌握指针,但是一旦他们完成了这些,他们就可以轻松理解图形数据。
第二个优点是指针非常快,前提是在写入数据时预期要遵循的导航路径。
使用指针来识别数据有几个缺点。一是数据被“固定”。也就是说,当数据要被打乱时,所有引用数据的指针都必须被定位和更新。或者“转发地址”必须留在旧位置。如果您曾经在网络上单击过一个一直有效的按钮,却遇到臭名昭著的“找不到页面”错误,那么您可能遇到过在不更新引用的情况下改组固定数据的陷阱.
第二个问题是,沿着计划外的访问路径导航数据在性能和逻辑正确性方面都可能是灾难性的。这就是图形数据库很难进行临时报告的原因之一。
图形数据的第三个缺点是,图形数据中可能存在给定数据不固有的逻辑关系。关系模型的基本优点是所有关系都是数据本身固有的。这是一个优势的原因很复杂。我再次请您参考 1970 年的论文。
在您和我可能使用的所有“关系型 DBMS”中,在使用数据识别数据和使用指针定位数据之间存在一座桥梁。它被称为索引。索引涉及两项:索引键(表中的一个或多个列)和指针(定位包含索引键的行)。我正在掩盖有关索引的所有细节。
无论如何,索引允许 SQL 引擎转换一个查询,该查询说明正在寻找什么数据到哪里寻找该数据。索引指向的数据仍然可以被洗牌,但索引必须作为该过程的一部分进行重建。
这是一个概述。
基本问题是无法支持临时查询。这些数据库非常快,但前提是您以原始设计者期望的方式查询它们。如果您想出另一种类型的查询,它们可能会非常慢,或者最坏的情况是需要更改数据库模式以支持查询。
实际上,我在 80 年代从事这两种类型的工作(Codasyl 和 Nomad/2),当 SQL 变得更广泛可用时,我感到非常高兴。
导航。分层和网络模型取决于数据库中的导航结构(又名指针/链接/图)。因此,它们的功能受到这些结构设计的限制。相比之下,关系模型“提供了一种仅以其自然结构来描述数据的方法——即,不为机器表示目的叠加任何额外的结构。”[1]
具有讽刺意味的是,当前数据库中的“NOSQL”趋势也包含导航结构,通常将它们(在我看来是非常错误的)视为 SQL 数据库感知局限性的良好解决方案。
[1]“数据大型共享数据库的关系模型”EF CODD,1970