关系数据模型与分层数据模型

2024-02-25

当。。。的时候关系模型 https://en.wikipedia.org/wiki/Relational_model由 F.E. Codd 提出,当时建立的数据库使用的是层次模型 https://en.wikipedia.org/wiki/Hierarchical_database_model。我的理解是,关系模型被认为是分层方法的重大改进。

我的直觉是,这“有道理”,有几个原因。

  • 关系模型似乎是“查询不可知的”,因为数据的形状不是反映您可能查询它的方式,而是结构化的,以便可以相对容易地提出任何问题。
  • 关系模型还使可变性变得简​​单。您可以通过向表中添加行(向集合中添加元组)或删除行来断言或撤销事实。相反,在分层设置中,您需要添加或删除其他对象,这会引入次要问题,例如如果父对象不存在,是否需要创建它;如果父对象为空,是否需要删除它。
  • 关系模型可以轻松地对不易适应父子方法的关系进行建模,例如三个实体之间的关系。
  • 关系模型似乎更适合模式增长,因为可以使用新表添加新类型的事实。谨慎地这样做不需要破坏现有的表(和事实)或依赖于它们的服务。

然而,虽然感觉关系数据模型有优势,但我想了解一下为什么它在当时被认为明显优越,并且大概仍然如此。

我真的很欣赏某种精炼形式的论点,或者理想情况下,一篇或多篇论文或其他文件,或者详细说明其背后推理的规范参考文献。

为了清楚起见,我并不是询问这两种方法的实际实现,或者它们在存储或计算方面的相对资源使用情况,除非这对答案非常重要。

Thanks.


说“当时建立的数据库使用层次模型”并不完全正确。

首先(挑剔),数据库管理系统使用/不使用某些物理结构。 “数据库”——即数据库设计可能会使用各种抽象。无论最终的物理平台如何,实体关系建模作为一种设计工具曾经并且仍然很流行。

其次,当时虽然分层模型通常用于“大铁”大型数据库,索引顺序 https://en.m.wikipedia.org/wiki/ISAM在过去所谓的“迷你计算机”上更为常见(例如 DEC PDP-8/-11;IBM System/34,/36;ICL 1900/ME29;Honeywell DPS4/DPS7)。

我们可以说磁盘上的索引顺序组织是从使用批量复制更新的打孔卡或磁带系统发展而来的。这就是“顺序”的由来。

你说你不想问具体的实施情况;但答案都是关于实际执行。顺序读取磁盘比随机访问(需要读头跳跃)更有效。这就是为什么与磁盘相反,内存被称为“随机存取存储器”。 (这是在 RAM 变得如此便宜以至于我们可以在内存中保存整个数据库之前很久的事了。)

同样,分层模型的组织是为了提供对常用查询路径的快速访问。该层次结构将紧密链接的节点放在物理磁盘的同一块上。因此,可以轻松地从客户导航到该客户的订单,再到该订单的项目行。

缺点是很难“跨”层次结构进行导航,例如查找项目 P5432 的所有订单行,无论是哪个客户/订单。 (此外,如果您想检索订购 P5432 的客户,您需要在层次结构中“向后”工作。如果它们都在同一块磁盘上,希望您不需要看得太远/也许它在加载到 RAM 的同一磁盘桶。)

类似地,索引顺序组织偏爱一种特定的索引——主键。如果您想按客户名称而不是号码进行搜索,则需要一个具有各种丑陋组织的“二级索引”,以将索引存储桶保留在数据附近的某个位置。还有臭名昭著的“桶溢出”,当您修改名称中的一个微小的拼写错误并将其转移到完全不同的字母位置时,它可能会导致机器停止运行。

(顺便说一句,NoSQL 数据库作为只有一个键的键值存储,似乎注定会陷入与二级索引有关的所有这些陷阱。它们需要第二个键值存储来提供替代索引,其中包含各种索引让它们保持同步很有趣。回到未来!)

Codd 在实现关系模型时遇到的最大问题是说服 IBM 高层相信该模型可以有效地支持通过多个“访问路径”进行查询。您会看到他的许多早期论文都在谈论将“导航”从查询编写器/程序员中抽象出来。事实上,最初的 System/R 设计有很多妥协,因为

a) IBM 工程师只是不理解 Codd 所说的数学抽象;

b) 他们非常害怕它会像狗一样表现,他们会失去工作。

[咳咳!个人观点:但是这个小组很久之后才聚在一起,并且在网络上有一些回忆。] 这些妥协一直持续到今天在 SQL 中;坦率地说,这是一堆垃圾,应该仅仅作为一个有趣的概念证明而被删除。

Codd 的模型是如何成功的(或者更确切地说 SQL 模型,not科德)?

  • 磁盘技术得到改进——尤其是寻道时间

  • 有人想出了哈希索引和 B 树,并将表的所有索引与实际数据保存在单独的内存中;而不是试图像磁带序列商店那样保存它。

  • 拉里·埃里森 (Larry Ellison) 嗅出了一些正在发生的事情,并从 IBM 工程团队中挖来了一些成员,在 Oracle 构建了同样的东西。迈克尔·斯通布莱克(Michael Stonebreaker)也组建了安格尔(Ingres)。

比赛开始了!没有时间停下来把一切都做好。实施您所拥有的内容(即 SQL 概念证明)并尽快将其推向市场,无论是否准备就绪。 (听起来是不是很熟悉的故事?)

您关于关系模型优越性的观点都很充分。它们本质上遵循标准化技术。不过,我想说的是,在 70 年代末/80 年代,人们并没有很好地理解它们。模式设计看起来很像分层或索引顺序数据模型,只是转换为“平面”表。特别是,有一种趋势是设计“宽”表,将我们所知道的有关某个客户的所有信息集中在一块磁盘上,而不是垂直分区。 (因为担心将分区连接在一起会影响性能。)这意味着很多不适用或“未知”的字段——这是 SQL 的 null 令人厌恶的地方。

所以你的“改进”还只是部分实现。也许有一天我们会看到一种针对关系模型设计的 DBMS。现在我们必须忍受 SQL。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关系数据模型与分层数据模型 的相关文章

  • 关系数据建模与非关系数据建模

    我有一个用户数据库 每个用户具有以下属性 user id name zip city In a 关系型数据库我会在表格中对其进行建模user user id name 位置 ID 并有第二个表称为location location id z
  • 用户和地址应该位于不同的表中吗?

    目前我的用户表有以下字段 Username Password Name Surname City Address Country Region TelNo MobNo Email 会员资格到期 会员数量 DOB Gender Blocked
  • 类图转换为关系模型;继承和匹配表

    对于一个学校项目 我应该设计上学期项目的系统 我们使用 UML 创建一个极其简单的用例图 没有 lt
  • Web 开发 - 对象数据库与关系数据库

    使用对象数据库或关系数据库进行涉及大量 CRUD 的常规 Web 开发有何优缺点 更新 我重新打开了赏金奖励 以便给内维尔 OODBMS 的概念已经被打破 过去几十年中出现的各种商业和免费产品几乎没有在市场上产生影响 就您可以向数据提出的问
  • Haskell 中关系数据的安全建模

    我发现在函数式程序中对关系数据建模是很常见的 例如 在开发网站时 我可能希望使用以下数据结构来存储有关我的用户的信息 data User User name String birthDate Date 接下来 我想存储有关用户在我的网站上发
  • 如何在 MongoDB 中组织多对多关系

    我有两个表 集合 用户和组 用户可以是任意数量的组的成员 并且用户也可以是任意数量的组的所有者 在关系数据库中 我可能有第三个表 名为 UserGroups 其中包含 UserID 列 GroupID 列和 IsOwner 列 我正在使用
  • 有什么理由仍然对数据库表和列使用蛇形命名法?

    当我开始数据库设计时 出于某种原因 建议您始终对表和列使用蛇形命名法 my table name 我认为在 MySQL 中尤其如此 原因是在某些情况下会丢失或强制使用大写 快进到今天 我看到很多人使用 Pascal Case MyTable
  • MySQL 通过在非索引列上执行删除语句时锁定整个表来尝试防止什么现象

    使用可重复读的 MySQL 隔离级别 给定表test具有非索引列quantity id quantity 1 10 2 20 3 30 Tx1执行第一个 注意它还没有提交 这意味着所有获取的锁还没有释放 Tx1 START TRANSACT
  • EF4 CTP5 自引用分层实体映射

    好吧 这应该很容易 但我一直在抓狂 这是我的 POCO 与机器零件有关 因此零件可以包含在父零件中 public class Part public int ID get set public string Name get set pub
  • Yii2如何检查两个模型是否已经链接

    我有两个通过连接表关联的模型 model gt link 是用于建立两个模型之间关系的方法 它基本上用两个模型的相应键填充连接表 如果两个模型已链接并且我尝试再次链接它们 则会出现错误 因为密钥对已存在于连接表中 然后我需要在尝试链接模型之
  • 优雅的模式来记录用户的操作

    我有一个数据库架构来记录用户在我的网络应用程序中执行的操作 Log Id Log Type Id Performed by Person Id Performed to Person Id Comment Id Story Id Photo
  • 在 SQL 数据库中,一对一关系何时应位于同一个表中,何时应位于不同的表中?

    任何人都可以提供一些示例 说明在 SQL 数据库中什么时候在同一个表上保留一对一关系是更好的选择 而什么时候将它们放在单独的表上更有意义 当您有多个实体 它们都必须能够充当另一个实体的外键 并且 几个实体 既有公共属性又有唯一属性 并且您希
  • 为什么 SQL 标准允许重复行?

    中的一个核心规则 http en wikipedia org wiki Codd 27s 12 rules对于关系模型来说 元组 行 所需的唯一性是 数据库中的每个单独的标量值must通过指定包含表的名称 包含列的名称和首要的关键包含行的值
  • 关系数据库和图数据库的比较

    有人可以向我解释一下 MySQL 等关系数据库与 Neo4j 等图形数据库相比的优缺点吗 在 SQL 中 您有多个表 它们之间有不同的 id 链接 然后你必须加入来连接表 从新手的角度来看 为什么要将数据库设计为需要联接 而不是像图形数据库
  • 多级父子排序

    我有一个物品清单 ID 名称 ParentID 1 abc 0 级别1 2 定义 1 3吉1 4 jkl 0 5米诺2 6 季度 5 7 AAA 1 8 威克斯 0 我希望列表排序为 美国广播公司 啊啊 定义 姆诺 吉 jkl 维克斯 也就
  • 复杂的sql树行

    表结构 id message reply id 1 help me 0 434 love to 1 852 didn t work 434 0110 try this 852 2200 this wont 0 5465 done 0110
  • 使用 Symfony 3 / Doctrine 进行属性形式的一对多对一

    问题是这样的 我有一个包含 3 个类的模型 person 人员 工作 job 一个人可以有多个工作 任何工作与人的关系都可以有 date start 属性 date end 和 comment 因此 我使用持有这些属性的可连接 person
  • 如何处理多个连接

    我有一个复杂的查询 需要总共 4 个表中的字段 内部联接导致查询花费的时间比应有的时间长得多 我已经运行了一个 EXPLAIN 语句 其可视化结果附在下面 这是我的查询 SELECT pending corrections correcte
  • 如何将图数据结构持久化到关系数据库中?

    我考虑过创建一个顶点表和一个边表 但是在内存中构建图和遍历子图是否需要大量查找 我想避免过多的数据库读取 还有其他方法可以保存图表吗 旁注 我听说过 Neo4j 但我的问题实际上是如何在概念上表示标准数据库中的图形 不过 我对一些 NoSQ
  • 关系代数 - 笛卡尔积与自然连接?

    我正在准备考试 但未能找到一个可靠的标准来确定笛卡尔积是否x要使用或者如果自然连接 X 是要使用的 我想出了一个粗略的指南 如果您需要投影与要连接的表中的属性同名的属性 则必须使用x并说明要投影的表名称 tableA colname1 ta

随机推荐