《SQL与关系数据库理论——如何编写健壮的SQL代码》一1.7 基关系vs.导出关系

简介: 本节书摘来华章计算机《SQL与关系数据库理论——如何编写健壮的SQL代码》一书中的第1章 ,第1.7节 C. J. Date 著 单世民 何英昊 许侃 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

本节书摘来华章计算机《SQL与关系数据库理论——如何编写健壮的SQL代码》一书中的第1章 ,第1.7节 C. J. Date 著 单世民 何英昊 许侃 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.7 基关系vs.导出关系

已经说过,关系代数的运算符使我们可以从某些指定的关系(比如图1.3中的那些关系)开始,然后用这些关系得到更多的关系(比如通过查询得到)。那些指定的关系称为基关系,而得到的那些关系称为导出关系。所以,为了能够进行关系运算,一个关系系统首先就必须提供一种方法来定义基关系。在SQL中,这个任务由CREATE TABLE语句完成(SQL中对应于基关系的是基表,即用CREATE TABLE创建的表)。基关系需要命名,比如:

CREATE TABLE S...;

但一些导出关系(尤其包括所谓的视图)也有名称。一个视图(也称为虚拟关系是一个已命名的关系,其在时刻t的值是某个关系表达式在时刻t的计算结果。下面是一个SQL示例:

CREATE VIEW SST_PARIS AS
    ( SELECT SNO , STATUS
    FROM         S
    WHERE         CITY = 'Paris' ) ;

理论上,你可以把视图当作基关系进行运算注12,但视图并不是基关系。相反,你可以认为视图在被用到的时候是“物化”的(实际上,你可以认为构造起来的基关系的值是由指定的关系表达式计算得到的)。但我必须强调的是,在引用视图时,认为视图是被这样物化的想法纯粹是概念上的想法;这只是一种思维方式,并不是实际上应该发生的,对任何情况下的更新运算也行不通。第9章会对视图到底应该怎样运行进行详细说明。
注意,对于基关系和视图的差异,经常有类似下面的说法(警告!谎言来了!):

  • 基关系真实存在。也就是说,它们在物理上存储在数据库中。
  • 相反,视图并不“真实存在”,它们只是提供查看基关系的不同方式而已。

但是,关系模型从来就没说什么东西是物理存储的!——事实上,关系模型完全没有提及物理存储这回事。尤其是,它根本没说基关系要物理存储。它的唯一要求是,必须要有从物理存储的东西到基关系的映射,以便在需要时获得基关系(至少概念上要如此)。如果基关系可以从物理存储的东西获得,那么什么东西也都可以。比如,我们可以物理存储供应商和出货的连接而不是分别存储两个关系。这样,在概念上,基关系S和SP可以通过对连接恰当的投影获得。换句话说,就关系模型而言,基关系没有比视图更 “物理化”。
关系模型不提及物理存储当然是有意的。其想法是给实现者选择模型实现方式的自由(尤其是选择看起来能够产生优秀性能的任何方式),而不必使实现者受物理数据独立性的羁绊。然而,可悲的事实是,大部分SQL产品供应商似乎都没有理解这一点(或者说至少没有应对这个挑战);相反,他们相当直接地将基表映射到物理存储注13,因此(前面提到过)其产品所提供的物理数据独立性也远没有达到关系系统能达到或本应达到的水平。实际上,大量(实际上相当普遍)使用“表和视图”进行表述的SQL标准本身(以及大部分其他的SQL文档)就反映了此种情形。显然,任何以此方式表达的人都认为表和视图是不一样的,而且可能还认为“表”总是特指基表,还有可能认为基表是物理存储着的,而视图不是。然而,视图的关键是,它是表(或者以我更倾向的说法,是关系);也就是说,用于常规关系的任何运算都可以用在视图上(至少在关系模型中是如此),因为视图就是“常规关系”。因此,我会在全书中使用术语关系来指各种形式的关系(可能是一个基关系,或是一个是图,又或者是一个查询结果,等等);如果我想特指一个基关系,我就会直接说“基关系”。建议:我强烈建议你也采用同样的规则。不要陷入“认为关系指的就是基关系”(或者用SQL的术语说,将表特指为基表)这个常见的陷阱中。类似的,也不要陷入“认为基关系(或SQL中的基表)必须物理存储”这样的陷阱。

相关实践学习
MySQL数据库快速部署实践
本场景主要介绍如何在一台配置了CentOS 7.7版本的ECS实例(云服务器)上安装mysql,执行mysql的常用操作,学习基本的SQL语句。
相关文章
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
847 152
|
5月前
|
存储 关系型数据库 数据库
附部署代码|云数据库RDS 全托管 Supabase服务:小白轻松搞定开发AI应用
本文通过一个 Agentic RAG 应用的完整构建流程,展示了如何借助 RDS Supabase 快速搭建具备知识处理与智能决策能力的 AI 应用,展示从数据准备到应用部署的全流程,相较于传统开发模式效率大幅提升。
附部署代码|云数据库RDS 全托管 Supabase服务:小白轻松搞定开发AI应用
|
8月前
|
存储 缓存 数据库
数据库数据删除策略:硬删除vs软删除的最佳实践指南
在项目开发中,“删除”操作常见但方式多样,主要分为硬删除与软删除。硬删除直接从数据库移除数据,操作简单、高效,但不可恢复;适用于临时或敏感数据。软删除通过标记字段保留数据,支持恢复和审计,但增加查询复杂度与数据量;适合需追踪历史或可恢复的场景。两者各有优劣,实际开发中常结合使用以满足不同需求。
802 4
|
9月前
|
SQL 自然语言处理 数据库
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
261 4
|
4月前
|
SQL 容灾 安全
云时代SQL Server的终极答案:阿里云 RDS SQL Server如何用异地容灾重构系统可靠性
在数字化转型的浪潮中,数据库的高可用性已成为系统稳定性的生命线。作为经历过多次生产事故的资深开发者,肯定深知传统自建SQL Server架构的脆弱性——直到遇见阿里云 RDS SQL Server,其革命性的异地容灾架构彻底改写了游戏规则。
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
9月前
|
数据库 数据安全/隐私保护
【YashanDB知识库】exp 导出数据库时,报错YAS-00402
【YashanDB知识库】exp 导出数据库时,报错YAS-00402
【YashanDB知识库】exp 导出数据库时,报错YAS-00402
|
10月前
|
关系型数据库 数据库连接 数据库
循序渐进丨MogDB 中 gs_dump 数据库导出工具源码概览
通过这种循序渐进的方式,您可以深入理解 `gs_dump` 的实现,并根据需要进行定制和优化。这不仅有助于提升数据库管理的效率,还能为数据迁移和备份提供可靠的保障。
317 6
|
11月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
3653 11

热门文章

最新文章