层次模型(Hierarchical Model) 确实是数据库发展史上最早的模型,核心结构就是树形结构。
不过,关于它是否“早就淘汰了”,答案稍微有点复杂:作为一种通用的主流数据库开发模式,它确实已经被关系型数据库取代了;但在特定的底层系统、遗留系统和特定应用场景中,它依然“活着”且非常重要。
在应用软件开发层面,层次模型确实“死”了,主要原因就是你提到的树形结构的硬伤:
● 只能“一对多”: 在层次模型中,一个孩子节点只能有一个父亲。如果你想表达“学生”和“课程”的关系(一个学生选多门课,一门课被多个学生选),在树形结构里非常痛苦,通常需要冗余数据或者引入虚拟节点。
● 查询太累: 你必须顺着树枝一层层往下找(导航式访问)。如果你想找深层的一个数据,必须从根节点开始遍历,效率在复杂查询下很低。
● 修改困难: 一旦结构定好了,想改结构(比如加个层级)非常麻烦,牵一发而动全身。
虽然我们现在写代码很少直接连一个“层次数据库”,但层次模型的思想无处不在:
● IBM IMS(大型机): 这是层次模型的鼻祖。直到今天,全球很多银行、保险公司的核心交易系统依然运行在 IBM 大型机上,底层用的就是 IMS。因为它在处理极其海量、结构固定、读多写少的数据时,速度快得惊人。
● 文件系统: 你的 Windows 资源管理器、Linux 的文件目录,本质上就是一个标准的层次模型(文件夹套文件夹)。
● XML 和 JSON: 现代开发中常用的 XML 和 JSON 数据格式,解析到内存中就是一棵树(DOM 树)。
● 注册表: Windows 的注册表也是典型的层次结构。
LDAP 和 ZooKeeper 都是层次模型(Hierarchical Model) 在现代分布式系统中的典型代表。
虽然它们的应用场景完全不同(一个管身份,一个管协调),但它们存储数据的核心结构本质上都是一棵树。我们可以把它们看作是“古老”的层次模型思想在不同领域的现代应用。
为了帮你更清晰地对比,我整理了它们的异同点:
1. 共同点:都是“树状结构”
它们都放弃了关系型数据库的“二维表”,而是采用了类似文件系统的目录树结构。
● 层级关系: 都有根节点、分支节点(容器)和叶子节点。
● 路径访问: 访问数据都靠“路径”。
● LDAP: 叫 DN(区分名),例如 cn=张三,ou=员工,dc=公司,dc=com 。
● ZooKeeper: 叫 Path(路径),例如 /app1/cluster/server1 。
● 命名空间: 都可以通过树的结构为不同的应用划分独立的“地盘”(Namespace)。
● LDAP 是用层次模型来管理“人”和“资源”。
● ZooKeeper 是用层次模型来管理“进程”和“状态”。
● LDAP 需要“归类”: 现实世界的组织架构(公司->部门->员工)天然就是树状的。用树形结构存储,查找“某部门下的所有人”非常快,符合目录服务的特性。
● ZooKeeper 需要“隔离”: 分布式系统里有很多应用(如 Kafka, HBase),用树形结构( /kafka , /hbase )可以天然地把不同应用的数据隔离开,互不干扰,且路径清晰易懂。