- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当F.E. Codd提出relational model时,当时建立的数据库使用了hierarchical model。我的理解是,关系模型被认为是对分层方法的重大改进。
我的直觉是,出于某些原因,这是“合理的”。
关系模型似乎是“查询不可知的”,因为它不是反映您查询方式的数据形状,而是结构化的,因此可以相对轻松地提出任何问题。
关系模型还使可变性变得简单。您可以通过向表中添加行(向集合中添加元组)或删除它们来断言或撤消事实。相反,在分层设置中,您需要添加或从其他对象中删除,这会引入一些次要问题,例如,如果父对象不存在,则需要创建父对象,如果它为空,则需要删除父对象。
关系模型可以轻松地建模不容易适合父子方法的关系,例如三个实体之间的关系。
关系模型似乎更适合架构增长,因为可以使用新表添加新的事实。谨慎执行此操作无需破坏现有表(和事实)或依赖于它们的服务。
但是,尽管感觉关系数据模型具有优势,但我想对为什么它在当时肯定被认为是显着优越的原因有一些见解,并且大概仍然如此。
我真的很欣赏某种形式的论点,或者理想情况下,一篇或多篇论文或其他文档,或者经过其背后推理的规范参考文献所引起的争论。
为了清楚起见,我不是在问哪种方法的实际实现,也不是在存储或计算方面它们的相对资源使用情况,除非这对答案很重要。
谢谢。
最佳答案
说“当时建立的数据库使用了层次模型”并不是很正确。
首先(很挑剔),是/不使用某些物理结构的数据库管理系统。 “数据库”-即数据库设计可以使用各种抽象。不管最终的物理平台如何,实体关系建模作为一种设计工具一直很流行。
其次,当时“大铁”大型数据库通常使用分层模型,而indexed-sequential在过去称为“微型计算机”(例如DEC PDP-8 / -11; IBM System / 34)上更为普遍。 ,/ 36; ICL 1900 / ME29;霍尼韦尔DPS4 / DPS7)。
我们可以说,磁盘上的索引顺序组织源于使用逐批更新的打孔卡或磁带系统。这就是“顺序”的来源。
您说您不想询问实际的实现;但是答案全在于实际的实现。顺序读取磁盘比随机访问(后者需要读取头跳动)更有效。这就是为什么与磁盘相比,内存被称为“随机访问内存”。 (很久以前,RAM变得如此便宜,我们可以将整个数据库保留在内存中。)
类似地,组织了层次模型以提供对常用查询路径的快速访问。层次结构将紧密链接的节点放在同一物理磁盘补丁上。因此,从客户到该客户的订单到该订单的项目行之间导航很容易。
不利的一面是,很难在整个层次结构中进行导航-例如,查找项目P5432的所有订单行,而与哪个客户/订单无关。 (此外,如果您随后要检索正在订购P5432的客户,则需要在层次结构上“向后”工作。如果它们全部位于同一磁盘补丁中,则希望您不必看起来太远/也许它在其中将相同的磁盘存储桶加载到RAM。)
同样,索引顺序组织偏爱一个特定的索引-主键。如果要按客户名称而不是编号进行搜索,则需要具有各种丑陋组织的“二级索引”,才能将索引存储桶保留在数据附近。还有臭名昭著的“存储桶溢出”现象,当您修改名称中的一个青少年的拼写错误时,可能会阻止机器死机,从而将其转移到完全不同的字母位置。
(顺便说一下,NoSQL数据库是仅具有一个键的键值存储,似乎注定会陷入与二级索引有关的所有陷阱。它们需要第二个键值存储来提供具有各种索引的备用索引。让他们保持同步很有趣。回到未来!)
Codd在实施关系模型时遇到的最大问题是说服IBM高层认为该模型可以有效地支持通过多个“访问路径”进行查询。您会看到他的许多早期论文都在谈论从查询编写器/编程器中抽象“导航”。实际上,原始的System / R设计有很多折衷之处,因为
a)IBM工程师只是不理解Codd所说的数学抽象;
b)他们害怕狗屎会像狗一样无聊,他们会丢掉工作。
[啊!个人意见:但是该小组聚在一起很久了,网上有些地方让人回想起。]这些折衷一直持续到“直到SQL为止。坦率地说,这是一堆杂物,应该仅仅作为一个有趣的概念证明而被杀死。
Codd的模型是如何成功的(或者更确切地说是SQL模型,而不是Codd的)?
磁盘技术得到改善-尤其是寻找时间
有人弄清楚哈希索引和b树,并将表的所有索引保存在与实际数据分开的内存中;而不是像磁悬浮磁带序列存储一样尝试保存它。
拉里·埃里森(Larry Ellison)嗅到即将发生的事情,并偷走了IBM工程团队的成员在Oracle建立同样的东西。迈克尔·斯通布雷克(Michael Stonebreaker)也成立了Ingres。
比赛开始了!没有时间停下来让一切都变得正确。实施您所拥有的(即SQL的概念证明)并将其匆匆推向市场,无论是否准备就绪。 (听起来像一个熟悉的故事?)
您对关系模型的优越性的观点都是精心设计的。它们本质上是根据规范化技术得出的。我要说的是,在上世纪70年代/ 80年代后期,人们对它们还没有很好的理解。模式设计看起来很像分层或索引顺序数据模型,只是被转换为“平面”表。特别是,有一种趋势是设计“宽”表,以将我们所了解的有关“客户”的所有信息聚集在一个磁盘补丁上,而不是垂直分区。 (由于担心将分区连接在一起会对性能造成影响。)这意味着很多不适用或“未知”的字段-这是SQL空值的可憎之处。
因此,您的“改进”还只是部分实现。也许有一天,我们会看到为关系模型设计的DBMS。现在,我们不得不忍受SQL。
关于relational-database - 关系v分层数据模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46321584/
我知道,关系数据库是一种数据库,其中一个表中的字段链接到其他表中的行,就像这样。 但我不明白这对我作为网络开发人员意味着什么! 据我所知,具有联接和嵌套选择的查询会降低性能(尤其是具有数十个联接的 d
我正在逻辑层面上设计一个数据库,以便稍后将其传递给程序员来交付。我只是粗略地了解它们的工作原理,所以我很难简洁地表达我的问题。这是我的问题: 我有一个名为 MEANINGS 的表。 我有一个名为 WO
在 Jira 中,将项目链接在一起既简单又实用。 例如,您可以轻松克隆一个问题:创建问题 100,将其克隆到 101。100 然后显示“这个问题有一个克隆:101”,然后 101 显示“这个问题是一个
所以我有这些实体: Group { id: number; name: string; persons: Person[]; } Person { name: stri
我真不敢相信,经过 5 年的 Rails 编程,我还没有想出一个好的解决方案来解决这个常见问题。另外,我假设这个特定问题有 100 个答案,但我不知道定义(关系?协会?等)来很好地搜索它。所以我们开始
我想在我的数据库记录中包含动态字段。 例如:我想构建一个应用程序供用户创建自己的表单。 用户可以创建以下表单: 个人资料: 全名 街道 工作 电话 首页 工作 移动 兴趣 兴趣 1 兴趣 2 兴趣 3
共有三个表:businesses、categories、categorizations、 CREATE TABLE businesses ( id SERIAL PRIMARY KEY, na
这个问题在这里已经有了答案: How can I vertically center a div element for all browsers using CSS? (48 个答案) 关闭 6
对于问题的错误措辞,我们深表歉意。我是 stackoverflow 的新手,也是 PIG 的新手,正在尝试自己进行实验。 我有一个处理 words.t 文件和 data.txt 文件的场景。 文字.t
关于像Cassandra 这样的反革命NoSQL 数据库的讨论很多。 , CouchDB , Hypertable , MongoDB , Project Voldemort , BigTable ,
我的处境与ICTylor's post here 类似。 . 所以我有: user1=User.find(1); user2=User.find(2); written=Micropost.where
尝试获取与事件关联的用户列表。这是我 Eloquent 模型: 用户.php: public function fbevents() { $this->belongsToMany('Fbeve
我有一个在 MySQL 数据库上运行的 Web 应用程序(正在开发中)。我正在考虑将我的应用程序迁移到 Google App Engine,并希望更好地了解如何将我的简单关系数据库模型转换为非关系方法
我应该在构造函数中放入什么:与实例相关的东西还是与类相关的东西? 考虑这段代码: var count = 0 TView = function (x, y) { this.x = x, this.y
我正在努力使用 postgreSQL,因为我不知道如何将 A 类型的一个实例链接到 B 类型的一组实例。我将举一个简短的例子: 假设我们要建立一个包含音乐专辑和人物的数据库,每个人都有一个他们最喜欢的
我需要检索一个对象并获取关系和嵌套关系。 所以,我有以下三个模型: 用户模型: module.exports = { attributes: { name: { type: '
给定一个表定义: Articles: art_id | name -------|-------------- 1 | article1 2 | article2 3
谁能举例说明“em 是相对于字体大小的,% 是相对于父元素的”? 相对于字体大小和相对于父元素是什么意思? 最佳答案 考虑一下您是否要在另一个框内定义一个框的高度。如果您将高度指定为 50%,它将是包
我有一个多对多关系,当我加载位于此关系一侧的实体时,我希望将另一侧相关实体的 ArrayCollection 视为其属性。然而,这并没有发生——加载的 ArrayCollection 中没有任何元素,
Relation#update(id, attributes) 文档提到“无论对象是否成功保存到数据库,都会返回结果对象。”,而 Relation#update_all (updates, condi
我是一名优秀的程序员,十分优秀!