在我们探索数据库系统的演进历程时,往往会发现技术的更替是为了解决前一代技术的局限性。你是否想过,在关系型数据库(RDBMS)出现之前,我们是如何处理复杂数据关系的?特别是当数据之间存在多对多的复杂关联时,简单的树状结构(层级模型)已经无法满足需求。这时,网状模型应运而生。
今天,我们将深入探讨 DBMS(数据库管理系统)中的网状模型。这不仅仅是一次历史的回顾,更是为了理解数据建模的核心思想。我们将看到它如何通过图结构打破层级限制,允许更灵活的数据访问,并分析它在现代数据架构中留下的宝贵遗产。让我们开始这段旅程吧!
目录
什么是网状模型?
简单来说,网状模型是一种数据模型,它允许数据以更灵活、更复杂的结构来表示“多对多”关系。与层级模型严格的父子树状结构不同,网状模型使用由节点(实体)和边(关系)组成的图结构来组织数据。
想象一下,在层级模型中,如果你是一个“子节点”,你只能有一个“父节点”。这就像在严格的家长制下,孩子只能归属于一个父亲。但在现实世界的数据库应用中,比如复杂的供应链系统或大学选课系统,一个实体往往需要同时属于多个上级分类。网状模型正是为了解决这种灵活性需求而诞生的。它通过允许记录拥有多个父节点,实现了更高效、更直接的访问路径,避免了数据冗余。
历史背景与核心概念:从 CODASYL 到图结构
为了真正掌握网状模型,我们需要回顾一下它的起源。这个模型最初是由数据库任务组(DBTG)在 20 世纪 60 年代后期规范化的,隶属于 CODASYL(系统语言会议咨询委员会)。它是层级模型的自然进化形式。
在这个模型中,数据被称为“片段”。与层级模型最大的区别在于,在这个模型中,一个片段可以拥有多个父节点。虽然这些片段在逻辑上被分组为不同的层级,但它们之间的关联不再局限于单一路径。通常情况下,任意两个片段之间都存在多对多的逻辑关联。
我们将这些片段之间的逻辑关联称为图。因此,这个模型用类似图的结构取代了层级树,使得不同节点之间可以存在更通用的连接。它可以拥有 M:N(多对多)关系,这允许一条记录拥有多个父级片段。
“系”的概念:所有者与成员
在网状模型的理论中,有一个非常重要的术语我们必须了解——“系”。每一个“系”至少由以下两种类型的记录组成,这是理解该模型运作的关键:
- 所有者记录: 它等同于层级模型中的父节点。它是关系的发起端,处于主导地位。
- 成员记录: 它等同于层级模型中的子节点。它是从属端,可以有多个。
这种结构允许我们建立复杂的数据网络。为了让你更直观地理解,让我们通过可视化的图表来分析它的结构。
网状模型的结构解析
为了更好地理解这种抽象的概念,让我们看一个典型的网状数据模型示意图。
图解分析:
在上面的图中,我们可以观察到层级模型中不可能出现的现象:
- 单一父级: 成员 INLINECODE92b675b5 只有一个所有者 INLINECODE076dc49c。
- 多重父级: 成员 INLINECODE7f8275f2 比较特殊,它有两个所有者,分别是 INLINECODEc02065fb 和
THREE。
这里展示了网状模型的核心力量。两种记录类型之间的每一个链接都代表着它们之间的一对多(1:M)关系。该模型在节点之间既包含横向连接,也包含自上而下的连接。因此,它允许给定实体之间存在 1:1、1:M、M:N 的关系。
这种设计极大地有助于避免数据冗余问题,因为它支持通过多条路径访问同一条记录。这意味着我们不需要在不同的位置重复存储相同的数据,只需要建立逻辑上的连接即可。该模型的各种实现案例包括 Cincom Systems Inc. 开发的 TOTAL,以及 Xerox Corp. 开发的 EDMS 等。
示例:财务部门的网状模型
理论可能有点枯燥,让我们来看看一个更贴近业务场景的例子。假设我们为一家公司的财务部门设计数据库。
!Network model of Finance Department.
业务逻辑分析:
在上面的图中,INLINECODE27ef9c60(推销员)、INLINECODE4121b7ad(客户)、INLINECODEd355c10a(产品)、INLINECODE9f75e94b(发票)、INLINECODEe1dd14ba(支付)、INLINECODE2eb661eb(发票明细)是该公司销售业务中的记录类型。
我们可以梳理出这样的业务逻辑:
- 发票明细的双重归属: 正如我们在图中看到的那样,INLINECODE89b87b79(发票明细)不仅属于某张发票,还关联到具体的产品。因此,INLINECODEcdd591a6 同时归属于 INLINECODEac79e2dd 和 INLINECODE0d2c9361。这是典型的多父级场景。
- 发票的复杂性: INLINECODE8b8ee19c(发票)也有两个所有者:它是由某个 INLINECODEe9b90bfb(推销员)开出的,同时也属于某个
CUSTOMER(客户)。
这种结构完美地捕捉了现实世界的业务流程,而在严格的层级模型中,要表示“发票明细”既属于“发票”又属于“产品”的关系,将会非常困难且会导致数据冗余。
深入探讨:复杂实例与代码模拟
让我们把难度稍微提高一点,看看在更复杂的场景下网状模型是如何工作的。特别是关于多对多(M:N)关系的处理,这是网状模型的一大亮点。
场景设定:大学教务系统
假设我们有两个实体:INLINECODE931f470b(教员/系)和 INLINECODE129602be(学生)。
现实生活中,一个学生(比如 John)既选修了 CS(计算机科学)系的课程,也选修了 EE(电子工程)系的课程。如果我们在层级模型中,John 只能属于一个系。但在网状模型中,我们不仅需要找出这里存在多少个实例,还需要处理这种错综复杂的关系。
对于上述示例,一个学生的实例至少可以有两个父级实例(CS 系和 EE 系)。因此,在学生片段和教员片段的实例之间存在着多对多的逻辑关联。
伪代码实现:模拟网状模型的 DDL 和 DML
为了让你对网状模型的操作有更具体的理解,虽然网状数据库通常使用 COBOL 等语言结合专有接口,但我们可以通过一种结构化的伪代码来模拟其核心操作。这里我们模拟一个基于集合的操作。
#### 示例 1:构建 Schema(模式定义)
在网状模型中,我们需要定义记录类型以及它们之间的系。
“INLINECODEd6da1e6f`INLINECODE50284688SELECT * FROM Student WHERE FacultyID = …INLINECODE4bc71b46GETFIRSTMEMBERINLINECODEd5203174GETNEXT_MEMBER`。
这正是网状模型(以及 IDMS 等具体实现)的典型操作方式。数据是通过指针链表连接在一起的。一旦找到了“所有者”记录(教员),数据库系统就会直接读取指向下一个成员的指针。这种方法在处理大规模数据时,性能往往优于早期的关系型数据库,因为它避免了昂贵的笛卡尔积运算。这就是为什么在金融交易等对性能要求极高的系统中,网状模型曾经长期占据主导地位的原因。
网状模型的优势:为什么它曾如此流行?
在我们继续之前,让我们总结一下网状模型的核心优势。这有助于我们在设计现代系统时,借鉴其优点:
- 简单与高效: 这个模型非常简单,易于设计(从概念上讲),类似于层级数据模型。在处理大量 1:N 关系时,它比 SQL 更加直观和快速。
- 处理复杂关系: 这个模型能够处理多种类型的关系(1:1, 1:M, M:N),这非常有助于对现实生活中的应用程序进行建模,比如复杂的供应链、航空预订或大学管理系统。
- 快速的数据访问: 在这个模型中,我们可以轻松地访问数据。应用程序有机会直接访问同一个系内的所有者记录和成员记录。如果你知道路径,数据检索就是瞬间的。
- 数据完整性: 这种网络结构不允许成员在没有所有者的情况下存在(强制保留规则),这天然地导致了数据完整性概念的加强。
- 多父级支持: 与层级模型最大的不同在于,这个模型允许表示多父关系,解决了数据冗余和更新异常的问题。
网状模型的劣势:为什么它最终被取代?
尽管网状模型在性能上表现出色,但它也有明显的局限性,这也正是为什么在 20 世纪 80 年代以后,关系型数据库逐渐成为主流的原因:
- 结构极其复杂: 该数据库的模式或结构本质上非常复杂,因为所有的记录都是通过使用指针来维护的。对于普通用户来说,想象数据的 3D 结构是非常困难的。
- 操作导航复杂: 由于使用指针进行导航,导致存在操作异常,进而使得开发变得复杂。程序员必须非常了解数据的具体存储路径。
- 用户不友好: 该模型的设计或结构对最终用户并不友好。普通的业务人员很难写出查询代码,通常需要专业的程序员。
- 缺乏查询优化: 该模型没有任何自动查询优化的空间。系统在很大程度上依赖程序员编写的路径效率。
- 结构独立性差: 尽管网状数据库模型能够实现数据独立性,但该模型未能实现结构独立性。如果你需要改变数据的结构(例如,把一个记录类型从一个系移到另一个系),你可能需要重写整个应用程序。
数据关系表示的最佳实践
在我们的实际应用中,网状模型告诉我们如何使用图结构来表示数据关系。它允许我们将复杂的业务逻辑直接映射到数据库结构中。
实战见解: 虽然我们在今天主要使用 SQL 数据库,但理解网状模型对于理解图数据库(如 Neo4j)以及现代 SQL 中的递归查询非常有帮助。当你在 SQL 中使用自连接或 CTE(公用表表达式)来处理层级数据时,你实际上是在用关系型的代码模拟网状模型的逻辑。
总结与展望
通过这篇文章,我们深入探讨了 DBMS 中的网状模型。我们回顾了它的历史起源,分析了它如何通过“系”和图结构解决多对多关系,并学习了它的优缺点。
核心要点回顾:
- 网状模型使用图结构,支持多对多(M:N)关系,是层级模型的进化版。
- 核心概念是“所有者记录”和“成员记录”,它们共同组成了“系”。
- 它的主要优势是访问速度快和数据完整性高,适合处理复杂关系。
- 它的主要劣势是结构复杂、缺乏结构独立性以及对用户/开发者不够友好。
作为开发者,即使我们在日常工作中不再直接使用 IDMS 或 Raima Database Manager 这样的网状数据库,理解这种模型依然至关重要。它提醒我们,数据结构的设计必须服务于业务逻辑的复杂性。
下一步建议:
在下一篇文章中,我们将探讨关系型数据库模型,看看它是如何通过“表”和“外键”将我们从复杂的指针导航中解放出来的,同时也要看看它为此付出了什么代价(性能)。我们将比较 SQL 的声明式查询与网状模型的导航式查询,看看你的应用究竟适合哪一种风格。