结构化查询语言/关系型数据库管理系统 (rDBMS)
关系型数据库管理系统是根据关系模型的设计规则对数据存储的实现。这种方法允许根据关系代数对数据进行操作,例如投影、选择、连接、集合运算(并集、差集、交集,…)等等。加上布尔代数(与、或、非、存在,…)和其他数学概念,关系代数构建了一个完整的数学系统,包括基本运算、复杂运算以及运算之间的转换规则。DBA 或应用程序程序员不需要了解关系代数。但了解你的 rDBMS 基于这种数学基础是有帮助的——以及它有自由将查询转换为多种形式。
关系模型将数据结构设计为关系(表),包含属性(列)以及这些关系之间的关系。关于现实世界中一个实体的信息存储在表的一行中。但是,术语现实世界中一个实体必须谨慎使用。可能是我们的智力以这种方式识别出一个像飞机这样的机器。根据信息需求,将所有信息放入飞机表的一行中可能就足够了。但在许多情况下,有必要将实体分解成它的组成部分,并将这些组成部分建模为离散实体,包括与整体的关系。例如,如果需要关于飞机中每个座位的详细信息,则需要一个名为座位的第二个表以及某种将座位与飞机连接起来的方法。
这种将关于真实实体的信息分解成复杂数据模型的方式在很大程度上取决于业务概念的信息需求。此外,还有一些独立于任何应用程序的形式要求:最终的数据模型应符合所谓的范式。通常,这些数据模型包含大量表格以及它们之间的关系。这些模型不会预先确定它们在应用程序中的使用;它们纯粹是描述性的,不会以任何方式限制对数据的访问。
数据库中的操作必须能够不仅对单个行,而且对行集进行操作。关系代数提供了这种可能性。因此,基于关系代数的语言,例如:SQL,提供了一个强大的语法来在一个命令中操作大量数据。
由于关系代数中的操作可以用不同的但逻辑上等效的操作来代替,因此基于关系代数的语言不应预先确定其语法如何映射到操作(执行计划)。该语言应该描述应该做什么,而不是如何做。注意:这种操作的选择与是否使用索引无关。
正如之前所描述的,关系模型倾向于将对象分解成子对象。在这种情况下和其他情况下,通常需要将来自一堆表中的关联信息收集到一个信息单元中。如何在没有参与表和行之间链接的情况下实现这一点?答案是:所有连接都是基于实际存储在属性中的值进行的。rDBMS 必须自行决定如何到达所有相关的行:是读取所有可能受影响的行并忽略那些不相关的行(全表扫描),还是使用某种索引并仅读取匹配条件的那些行。这种基于值的方案甚至允许使用除等于运算符以外的其他运算符,例如
SELECT * FROM gift JOIN box ON gift.extent < box.extent;
此命令将所有“礼物”记录连接到所有“盒子”记录,其中“盒子”的“范围”更大(无论“范围”是什么意思)。