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

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(使用前将#替换为@)

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

  • 该 ER 图是否应该使用三元关系

    我一直在查看 ER 图的示例以更好地理解它们 我发现了一张 ER 图 我不确定它是否正确 这是问题 规范 UPS 自豪地拥有有关每个邮件的处理和当前位置的最新信息 已发货的物品 为此 UPS 依靠全公司范围的信息系统 运送的物品有 UPS
  • SQL 查询以获取主管层次结构列表。员工-->主管-->主管

    我有两个表 员工 和 部门 该图像显示了每个员工的经理 我想编写一个 SQL 查询 为我提供所有主管 经理 经理的经理 的列表 我只想要一个列 在给定特定员工时显示主管列表 例如 如果我给员工 id 202 那么我应该收到 200 130
  • 关联类的正确使用

    我是 UML 的新手 我不确定我的图表是否正确 我希望得到比我更有经验的人的建议 我的问题的陈述说 学生学习课程 每个学生可以选修几门课程 每门课程 学习 任何课程都可以有多个学生学习 学生由数字代码识别 有姓名 出生日期和一个或多个国籍
  • 由于关系,DataMapper 无法删除记录

    我使用 Torrent 和 Tag 设置了多对 DataMapper MySQL 如下所示 class Torrent include DataMapper Resource property id Serial property name
  • Mysql 5有管理分层数据的程序吗?

    我使用嵌套集模型来保存分层数据 http mikehillyer com articles managing hierarchical data in mysql 进入数据库表 我感兴趣的是 MySQL 是否内置支持添加 删除节点 或者我必
  • 查询SQL Server上存储过程的内容

    我正在探索一个遗留数据库系统 对其内部结构知之甚少 我想找到调用另一个存储过程的所有存储过程A 如何最好地做到这一点 我可以写这样的伪代码吗 select name from AllStoredProcedures as Asp where
  • Ruby on Rails:在单个数据库单元中保存多个值

    如何在 Ruby on Rails 应用程序中的单个单元格记录中保存多个值 如果我有一个名为Exp列名为 Education Experience and Skill 如果我希望用户在单行中存储多个值 例如 教育机构或技能 最佳实践是什么
  • 如何以干净的方式创建通过外键与 Room DB 相关的行和子项?

    这个问题在某种程度上与我的最后一个问题 https stackoverflow com q 69384937 3692177 因为这是同一个项目 但现在我正努力向前迈进一步 所以 在我之前的问题中 我只有一张桌子 这次我有两个表 新的第二个
  • 如何在 MongoDB 中组织多对多关系

    我有两个表 集合 用户和组 用户可以是任意数量的组的成员 并且用户也可以是任意数量的组的所有者 在关系数据库中 我可能有第三个表 名为 UserGroups 其中包含 UserID 列 GroupID 列和 IsOwner 列 我正在使用
  • Oracle 10g PL/SQL Connect By Prior 返回同一行上的子级和父级

    Table1 Child Parent a Bob Chris 2 Chris Kate 1 Shane Lana 3 Nala Bob 4 Table2 b Talent 1 something 2 nothing 3 something
  • 使用继承时出现重复的外键

    我创建了这些类 以便通过 EntityFramework 6 代码优先方法生成数据库模型 public class Vehicle public long Id get set public long ResponsiblePersonId
  • Eloquent 关系同步也会删除吗?

    更新模型并同步关系时 如果我不传入所有已存在的 id 该关系是否会被删除 你决定 sync有第二个参数 默认为true并负责分离 model gt relationship gt sync 1 2 3 model gt relationsh
  • 为什么关系数据库存在可扩展性问题?

    最近我在网上看到一些文章 指出关系数据库存在扩展问题 在大数据方面不太好用 特别是在数据量很大的云计算中 但通过谷歌搜索 我找不到充分的理由来解释为什么它的可扩展性不高 您能解释一下关系数据库在可扩展性方面的局限性吗 Thanks 想象一下
  • R闪亮的分层下拉列表

    我们需要在 R闪亮中创建一个分层下拉列表 该列表至少有 3 个级别 您能帮我确定正确的库吗 请参考下面的图片供您参考 目前我们正在使用下面的代码 但是我们在下拉列表中得到了不正确的列 ui R library shiny library s
  • EF4 CTP5 自引用分层实体映射

    好吧 这应该很容易 但我一直在抓狂 这是我的 POCO 与机器零件有关 因此零件可以包含在父零件中 public class Part public int ID get set public string Name get set pub
  • 代数 关系 sql GROUP BY SORT BY ORDER BY

    我想知道代数关系中的 GROUP BY SORT BY 和 ORDER BY 等价于什么 这两种操作在关系代数中都是不可能的 但人们一直在为这些操作创建一些 扩展 注 在原文中 部分文本写为下标 GROUP BY 根据 数据库系统基础 一书
  • Yii2如何检查两个模型是否已经链接

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

    关系模式中的无损连接属性是什么意思 是否能够在关系分解过程中保持信息 数据的语义 同时进行规范化 The 无损连接属性是归一化支持的分解特征 它能够确保原始关系的任何实例都可以从较小关系中的相应实例中识别出来
  • 关系数据库和图数据库的比较

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

    有没有办法将表示组的字符串解析为 R 中的层次结构 假设我的小组结构如下 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 3 1 1 3 1 1 1 3 2 1 1 3 3 1 2 1 2 1 1 2 1 1 1 2 1 2 1

随机推荐