《SQL与关系数据库理论——如何编写健壮的SQL代码》一一1.5 模型vs.实现
本节书摘来华章计算机《SQL与关系数据库理论——如何编写健壮的SQL代码》一书中的第1章 ,第1.5节 C. J. Date 著 单世民 何英昊 许侃 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.5 模型vs.实现在继续深入之前,有必要对一点进行解释,因为此点是本书所有讨论内容的基础。关系模型当然是数据模型。不过,“数据模型”这个术语在数据库世界里面有两个截然不同的含义。第一个也是更为基本的含义如下:
定义 数据模型(第一释义)是对数据结构及数据运算符等内容的具有自包含特征的抽象逻辑定义,这些定义总体构成了用于用户交互的抽象机(abstract machine)。
此含义是我们在讨论关系模型时所认定的含义。有了此定义,我们就可以有效地将采用第一释义的数据模型和数据模型的实现进行区分,这是重要的。数据模型的实现的定义如下:
定义 一个确定的数据模型的实现(implementation)是构成此数据模型的抽象机各个组件在真实机器(real machine)上的物理实现(realization)。
现在让我通过关系模型的方式来描述这些定义。首先,考虑关系这个概念本身。此概念是模型的一部分:用户必须懂得到底关系是什么,必须懂得关系由元组和属性组成,必须懂得怎么解释关系等等。所有这些都是模型的内容。然而,用户并不用懂得关系是怎样物理存储在磁盘上的,不用懂得每个数据值是如何物理编码的,也不用懂得存在什么索引或其他的存取路径;这些都是实现的内容,不是模型的内容。
考虑连接(join)的概念:用户必须懂得连接是什么,必须懂得怎么进行连接,必须懂得连接结果是什么样子,等等。这些也都是模型的内容。但是,用户并不用懂得连接是怎样物理实现的,不用懂得表象之下到底进行了什么表达式变换,也不用懂得到底用了什么索引或者存取路径,更不用懂得发生了什么物理I/O运算;所有这些都是实现的内容,不是模型的内容。
再多举一个例子:候选键(简称为键)也是模型的内容。用户必须懂得键是什么,必须懂得键具有唯一性(uniqueness)。虽然键的唯一性在当前系统中基本都是通过所谓的“唯一性索引”方式实现的,但是普通索引以及唯一性索引都不是模型的内容,都是实现的内容。因此,即使唯一性索引可以用于实现键(准确说,是实现键约束,参见第8章),在关系化的意义下也千万不能把唯一性索引和键相混淆。
简言之:
请注意,我可没说不让用户懂得实现;我只是说他们可以不懂。换句话说,和实现相关的所有内容应该是(至少潜在地)对用户隐藏的。
前述定义有一些重要的推论。首先,和性能有关的事情都基本上都是实现问题而不是模型问题。对于此点,人们普遍没有正确认知!比如,我们经常听到评论说“连接是很慢的”。这种评论根本没有意义。连接是模型的一部分,而模型谈不上快和慢,只能说实现处理得快和慢。因此,我们可以合理地说某特定产品X对于某些特定数据进行某种连接比另一种产品Y具有更快或更慢的实现——如此而已。
不过,我不想在此处给读者留下错误的印象。性能基本上是一个实现问题;然而,这并不意味着好的实现在你乱用模型的情况下也能表现优秀。实际上,这也正是你为什么需要懂得模型的原因——这样你就不会乱用。如果你写了一个类似S JOIN SP的表达式,你期望系统高效地实现它;但是如果你坚持要自己手写类似下述的连接代码(伪代码)
do for all tuples in S; fetch S tuple into TS, TN, TT, TC; do for all tuples in SP with SNO=TS; fetch SP tuple into TS,TP,TQ; emit TS,TN,TT,TC,TP,TQ; end;
那就没办法去获得好的性能。建议:别这么做。不应该像简单的存取方法那样来使用关系系统。注8
另外,这些关于性能的说明也适用于SQL。与(连接等)关系运算符相似,SQL也谈不上快还是慢——只有这么描述“实现”才是有意义的——不过也可能有导致性能低下的SQL用法。尽管本书中对于性能说的很少,但我还是会时常指出我所建议内容对性能造成的影响。
旁注:对于性能话题我想多说一点。大体上,我在本书中的建议都不会把性能作为一个主要的出发点;毕竟,关系模型的一贯目标就是让系统(而非用户)考虑性能。然而,大家都知道这个目标仍然没有完全达到,所以关系化使用SQL的目标有时也必须让步于获得满意性能的诉求。这就是先前讲到的最高原则为什么必须是“只要你知道你正在做什么,那么你怎么做都行”的另一个原因。
我们回到模型 vs.实现以及两者区分所引出的要点。你可能意识到了第二点,即正是模型和实现的分离使我们获得了物理数据独立性。物理数据独立性(不是特别准确的术语,但我们似乎就得用它了)指的是,我们可以随意改变数据的物理存取方式而不必对用户观察数据的方式进行对应更改。一般来说,我们要改变数据存取细节的原因是性能;而“改变数据的物理存取方式而不必对用户观察数据的方式进行对应更改”这一点意味着,现存的程序、查询等都可以在变更之后继续有效。因此,物理数据独立性意味着“保护对用户培训及应用程序的投资”(我个人还想加上“对逻辑数据库设计的投资”),这十分重要。
根据前面所讲的内容,索引(实际上是包括索引在内的任一种物理存取路径)是实现的内容而不是模型的内容;它都属于隐藏内容,应该对用户是不可见的。(注意,此种存取路径在关系模型中没有提及)。因为同样的原因,存取路径也应该严格地排除在SQL之外。建议:避免使用任何违反此认知的SQL结构(SQL标准中实际上也没有结构违反此认知,不过我知道有一些SQL产品就不是这样的)。
正如你可以从前面的定义中看出的那样,模型和实现之间的差别不管怎么说实际上都只是逻辑考虑与物理考虑之间差别的特例(非常重要的特例)而已。然而,当今的大多数SQL系统并没有将这些差别明确到应该达到的水平。此种情况的直接后果就是它们所提供的物理数据独立性远没有达到它们本应达到的水平,也远没有达到关系系统理论上可以达到的水平。下一节会继续讨论这个问题。
现在再来说说数据模型的第二种含义。我敢说,你对这个含义非常熟悉。
定义 数据模型(第二释义)是某些特定企业的数据(尤其是持久化数据)的模型。
换句话说,数据模型的第二释义只是(逻辑,并可能有些抽象)数据库设计。比方说,我们可以谈论针对银行、医院或者政府部门的数据模型。
解释了这两种不同的含义之后,下面这个类比可以很好地说明两种含义之间的关系:
另外,由上述内容可知:如果我们在第二种释义下讨论数据模型,就可以使用复数形式来说数据模型,或者用不定冠词来说一个数据模型。但是如果我们在第一种释义下讨论数据模型,那么就只有一个数据模型,而且就是这个数据模型(此处为定冠词)。附录A中会详细说明在第一种释义下对数据模型的讨论。
对于本书后续内容,我会基于第一种释义来使用“数据模型”,或更为简洁地称为“模型”。
SQL关系模型与关系数据库 回忆一下我们之前了解过的,SQL语言控制的数据库是建立在哪个数据模型上的? ——答案很显然,是“关系模型”。SQL是访问关系数据库的计算机标准语言,而关系数据库正是建立在各系模型上的。
《数据库系统概论》十一章汇总--基于《数据库系统概论》第五版王珊一书|第三章 --关系数据库标准语言SQL(重点) 该系列的博客都是基于《数据库系统概论》第五版王珊一书,进行的知识总结和课后习题汇总,从第一章到第十一章,如果觉得不错记得收藏点个赞吧~你的小小支持,是我的大大动力!
阿里云分布式关系数据库DRDS - 实时SQL执行日志分析(一) 阿里云分布式关系数据库DRDS的SQL执行日志已经与日志服务打通,提供实时的SQL审计分析功能,并提供内置可深钻的报表、支持异常报警与生态对接能力等。
《数据库基础及实践技术——SQL Server 2008》一1.5 关系数据库规范化理论 本节书摘来自华章出版社《 数据库基础及实践技术——SQL Server 2008》一 书中的第1章,第1.5节,作者:何玉洁,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
《数据库基础及实践技术——SQL Server 2008》一第1章 关系数据库基础 本节书摘来自华章出版社《 数据库基础及实践技术——SQL Server 2008》一 书中的第1章,作者:何玉洁,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
《《SQL与关系数据库理论——如何编写健壮的SQL代码》》一导读 SQL无所不在。尽管如此,SQL却难以使用:SQL是复杂的,令人困惑且容易出错(我敢说比它的卫道士所声称的更容易出错)。所以,为了写出你能确信的精确SQL代码(意思是它准确地做到了要求它做的事),你就必须遵从一些适当的准则。
《SQL与关系数据库理论——如何编写健壮的SQL代码》一3.10 小结 本节书摘来华章计算机《交互式程序设计 第2版》一书中的第3章 ,第3.10节,Joshua Noble 著 毛顺兵 张婷婷 陈宇 沈鑫 任灿江 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。
相关文章
- 基于锁的并发算法 vs 无锁的并发算法
- EntityFramework Core 5.0 VS SQLBulkCopy
- 将 VS Code 终端设置为始终以管理员权限打开
- SQL SERVER 2012启动失败 because upgrade step 'SSIS_hotfix_install.sql' 失败
- 【学习总结】SQL的学习-2-sql操作
- [Functional Programming] Arrow contramap vs map and promap
- SQL Server vs Oracle 简单语法比较
- SQL Server vs Oracle 简单语法比较
- Sql Server中sql语句自动换行
- Atitit 读取数据库的api orm SQL Builder sql对比 目录 1.1. 提高生产效率的 ORM 和 SQL Builder1 1.2. SQL Builder 在 SQL
- Runtime Flow for VS 2017-2022
- Database之SQL:自定义创建数据库的各种表demo集合(以方便理解和分析sql的各种增删改查语法的具体用法)
- DL之Mask R-CNN:2018.6.26世界杯阿根廷队VS尼日利亚比赛2:1实现Mask R-CNN目标检测
- 成功解决Visual Studio 2015安装时,点击vs_community.exe 没有反应
- SQL基础【二十、索引】(超细致版本,前理论,后实践,应对sql面试绰绰有余)
- Python VS SQL语法归纳总结,真的太全了
- SQL VQ11 找出sql类题目的单次最大刷题数
- 【SQL干货】一条sql按季度统计交易数据
- vs 编译时不断出现该文件已在源编辑器之外被修改弹窗
- vs使用技巧
- 010-Hadoop Hive sql语法详解5-HiveQL与SQL区别
- 截断误差VS舍入误差
- sql 精读(三) 标准 SQL 中的编号函数示例
- VB.net:VB.net编程语言学习之基于VS软件利用VB.net语言实现对SolidWorks进行二次开发的案例应用(启动SolidWorks代码/直接驱动模型代码/路径下模型驱动代码/创建两个文
- 将dumpbin从VS中抠出来,并使用dumpbin查看exe和dll库的依赖关系