如何使用SQL系列 之 理解什么是关系数据库

news2024/12/23 18:01:17

简介

数据库管理系统 (DBMS)是允许用户与数据库交互的计算机程序。DBMS允许用户控制对数据库的访问、写入数据、执行查询以及执行与数据库管理相关的任何其他任务。

为了执行这些任务,DBMS必须有某种底层模型来定义数据的组织方式。关系模型是一种组织数据的方法,自20世纪60年代末首次设计以来,它在数据库软件中得到了广泛的应用,以至于在撰写本文时,最受欢迎的前5种DBMS中有4种都是关系模型。

概念上的这篇文章概述了历史的关系模型,关系数据库如何组织数据,以及如何使用它们。

关系模型的历史

数据库是对信息或数据进行逻辑建模的集群。任何数据集合都是数据库,无论它以何种方式或在何处存储。甚至一个包含工资单信息的文件柜也是一个数据库,医院病人表单的堆栈或散布在多个位置的公司客户信息的集合也是数据库。在用计算机存储和管理数据成为普遍做法之前,像这样的物理数据库是需要存储信息的政府和商业组织唯一可用的数据库。

大约在20世纪中叶,计算机科学的发展使机器具有了更强的处理能力,以及更大的本地和外部存储容量。这些进步使计算机科学家开始认识到这些机器在存储和管理越来越多的数据方面的潜力。

然而,当时还没有任何理论可以解释计算机如何以有意义的、合乎逻辑的方式组织数据。在机器上存储未排序的数据是一回事,但要设计出能够以一致、实用的方式添加、检索、排序和管理数据的系统则要复杂得多。对存储和组织数据的逻辑框架的需求导致了许多关于如何利用计算机进行数据管理的建议。

早期的数据库模型是层次模型,其中数据被组织成树状结构,类似于现代的文件系统。下面的例子展示了用于动物分类的分层数据库的部分布局:

Example Hierarchical Database: Animal categorization

层次模型在早期的数据库管理系统中得到了广泛的实现,但它也被证明有些不灵活。在这个模型中,即使单个记录可以有多个“子”,但每个记录在层次结构中只能有一个“父”。因此,这些早期的分层数据库仅限于表示“一对一”和“一对多”关系。缺乏“多对多”关系可能会在处理需要关联多个父节点的数据点时产生问题。

20世纪60年代末,在IBM工作的计算机科学家埃德加·f·科德(Edgar F. Codd)设计了数据库管理的关系模型。Codd的关系模型允许单个记录与多个表关联,从而支持数据点之间的“多对多”关系以及“一对多”关系。在设计数据库结构时,这比其他现有模型提供了更多的灵活性,也意味着关系数据库管理系统(RDBMS)可以满足更广泛的业务需求。

Codd提出了一种管理关系型数据的语言,称为Alpha,它影响了后来数据库语言的发展。科德在IBM的两个同事,唐纳德·钱伯林和雷蒙德·博伊斯,创造了一种受阿尔法启发的语言。他们将这门语言命名为SEQUEL,它是(Structured English Query Language)的缩写,但是由于现有的商标,他们将这门语言的名称缩短为SQL(Structured Query Language),更正式的说法是结构化查询语言

由于硬件的限制,早期的关系型数据库仍然很慢,过了一段时间才得到广泛应用。但是到20世纪80年代中期,Codd的关系模型已经在IBM及其竞争对手的许多商业数据库管理产品中实现。这些厂商也效仿IBM的开发和实施自己的SQL方言。到1987年,美国国家标准协会(American National Standards Institute)和国际标准化组织(International Organization for Standardization)都批准并发布了SQL的标准,巩固了SQL作为公认的RDBMS管理语言的地位。

关系模型在多个行业中的广泛使用使其成为公认的数据管理的标准模型。尽管近年来出现了各种NoSQL数据库,关系数据库仍然是存储和组织数据的主要工具。

关系型数据库如何管理数据

现在您对关系模型的历史有了大致的了解,让我们仔细看看模型是如何组织数据的。

关系模型中最基本的元素是关系(relations),用户和现代RDBMS将其视为(table)。关系是一组元组(tuples)或表中的行,每个元组共享一组属性(attributes)或列:

Diagram example of how relations, tuples, and attributes relate to one another

列是关系数据库中最小的组织结构,表示定义表中记录的各个方面。因此,它们的更正式的名称是属性。你可以将每个元组看作是表中保存的任何类型的人、对象、事件或关联的唯一实例。这些例子可能是公司的员工、在线业务的销售额或实验室测试结果。例如,在一个保存学校教师员工记录的表中,元组可能具有诸如namesubjectsstart_date等属性。

当创建列时,你需要指定一个数据类型来指定该列允许哪些类型的条目。关系数据库管理系统通常实现自己独特的数据类型,这些数据类型与其他系统中的类似数据类型不能直接互换。一些常见的数据类型包括日期、字符串、整数和布尔值。

在关系模型中,每个表包含至少一列,可以用来唯一标识每一行,称为主键。这很重要,因为这意味着用户不需要知道他们的数据在机器上的物理存储位置;相反,它们的DBMS可以跟踪每条记录,并临时返回它们。反过来,这意味着没有定义的逻辑顺序,记录和用户有能力回报他们的数据中他们想要的任何订单或通过任何过滤器。

如果你有两个表想要相互关联,一种方法是使用外键。外键本质上是一个表(父表)主键的副本,插入到另一个表(子表)的一列中。下面的示例突出了两个表之间的关系,一个用于记录关于公司员工的信息,另一个用于跟踪公司的销售。在这个例子中,EMPLOYEES表的主键被用作SALES表的外键:

Diagram example of how the EMPLOYEE table's primary key acts as the SALES table's foreign key
如果想向子表添加一条记录,而输入到外键列的值在父表的主键中不存在,那么插入语句将无效。这有助于维护关系级别的完整性,因为两个表中的行总是正确关联的。

关系模型的结构元素有助于数据存储在一个有组织的方式,但存储数据仅仅是有用的,如果你可以检索它。要从RDBMS中检索信息,你可以发出一个查询,即对一组信息的结构化请求。如前所述,大多数关系型数据库使用SQL来管理和查询数据。SQL允许您使用各种子句、谓词和表达式过滤和操作查询结果,从而可以精确地控制将出现在结果集中的数据。

关系数据库的优点和局限性

了解了关系数据库的基本组织结构后,让我们考虑一下它们的一些优点和缺点。

今天,SQL和数据库,实现它在几个方面偏离科德的关系模型。例如,Codd的模型规定表中的每一行都应该是唯一的,而出于实用性的考虑,大多数现代关系型数据库都允许重复行。有一些不考虑关系数据库SQL数据库是真的如果他们不遵守每个科德的规范关系模型。实际上,任何使用SQL并且至少在某种程度上遵循关系模型的DBMS都可能被称为关系数据库管理系统(relational database management system)。

虽然关系型数据库迅速流行起来,但随着数据变得越来越有价值,企业开始存储更多的数据,关系型模型的一些缺点开始变得明显。首先,它可能很难规模水平关系数据库。水平扩展,或称向外扩展,是指向现有堆栈中添加更多的机器,以分散负载,并允许更多流量和更快的处理。这通常与垂直扩展相对,后者涉及升级现有服务器的硬件,通常是通过增加更多的RAM或CPU。

很难水平扩展一个关系型数据库的原因是,关系型模型的设计是为了保证一致性,这意味着查询相同数据库的客户端总是会检索到相同的数据。如果要在多台机器上水平扩展关系型数据库,就很难保证一致性,因为客户端可能会将数据写入一个节点,而不会写入其他节点。在初始写入和其他节点更新以反映更改之间可能存在延迟,从而导致它们之间的不一致性。

RDBMS的另一个限制是关系模型被设计为管理结构化数据,或者与预定义的数据类型保持一致,或者至少以某种预定的方式组织的数据,使其易于排序和搜索。与个人电脑的传播和互联网的兴起在1990年代早期,然而,非结构化数据——如电子邮件、照片、视频等。——变得越来越普遍。

这并不是说关系数据库没有用处。相反,经过40多年的发展,关系模型仍然是数据管理的主导框架。它们的流行程度和寿命意味着关系数据库是一种成熟的技术,这本身就是它们的主要优势之一。有许多应用程序是为关系模型设计的,也有许多职业数据库管理员,他们是关系数据库方面的专家。对于那些想开始接触关系数据库的人来说,还有大量的纸质和在线资源可供选择。

关系数据库的另一个优点是几乎每个RDBMS都支持事务。事务由一个或多个单独的SQL语句组成,这些语句作为一个工作单元按顺序执行。事务是一种全有或全无的方法,这意味着事务中的每条SQL语句都必须有效;否则,整个事务将失败。在对多行或多表进行更改时,这对于确保数据完整性非常有用。

最后,关系数据库非常灵活。它们已被用于构建各种不同的应用程序,即使在数据量非常大的情况下也能高效地工作。SQL也非常强大,允许您动态添加和更改数据,以及在不影响现有数据的情况下更改数据库模式和表的结构。

总结

由于其灵活性和数据完整性的设计,关系数据库在被提出50多年后仍然是管理和存储数据的主要方式。即使近年来各种NoSQL数据库兴起,理解关系模型以及如何使用RDBMS对于任何想要构建利用数据力量的应用程序的人来说都是关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/957423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue自定义键盘

<template><div class"mark" click"isOver"></div><div class"mycar"><div class"mycar_list"><div class"mycar_list_con"><p class"mycar_list_p">车牌号</p>…

OpenCV(一):Android studio jni配置OpenCV(亲测有效,保姆级)

目录 1.下载OpenCV的SDK 2.创建Android Native C项目 3.Android项目中导入OpenCV工程 4.导入OpenCV的库文件 5.实现opencv高斯模糊图像处理的demo 要在Android Studio中配置使用OpenCV库的C方法&#xff0c;需要完成以下步骤&#xff1a; 1.下载OpenCV的SDK 首先&#x…

SpringBoot项目配置文件数据库用户名密码加密

1、需求 在使用SpringBoot开发过程中&#xff0c;会将一些敏感信息配置到SpringBoot项目的配置文件中(不考虑使用配置中心的情况 )&#xff0c;例如数据库的用户名和密码、Redis的密码等。为了保证敏感信息的安全&#xff0c;我们需要将此类数据进行加密配置。 2、操作步骤 …

<Linux>《SHELL脚本在crontab环境下执行失败问题处理》>> 探索SHELL运行模式和加载环境变量【实践+实验】

《SHELL脚本在crontab环境下执行失败问题处理》>> 探索SHELL运行模式和加载环境变量【实践实验】 1 现象描述2 分析3 解决方法4 深层研究4.1 shell4.2 shell脚本的环境变量4.3 shell脚本四种执行方法4.4 source 、.、./、bash 的区别4.5 shell常用的一些参数4.6 shell常见…

Netty源码NioEventLoop解析

带着问题源码 Netty 的 NioEventLoop 是如何实现的&#xff1f;它为什么能够保证 Channel 的操作是线程安全的&#xff1f;Netty 如何解决 JDK epoll 空轮询 Bug&#xff1f;NioEventLoop 是如何实现无锁化的&#xff1f; 一、作用与设计原理 Netty的NioEventLoop并不是一个存…

基于Spring Boot的住院病人管理系统设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的住院病人管理系统设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java spring…

JavaScript基础04

JavaScript 基础 文章目录 JavaScript 基础函数声明和调用声明&#xff08;定义&#xff09;调用 参数形参和实参 返回值作用域全局作用域局部作用域 匿名函数函数表达式立即执行函数 理解封装的意义&#xff0c;能够通过函数的声明实现逻辑的封装&#xff0c;知道对象数据类型…

大数据项目实战(安装Hive)

一&#xff0c;搭建大数据集群环境 1.3 安装Hive 1.3.1 Hive的安装 1.安装MySQL服务 1&#xff09;检查是否安装MySQL&#xff0c;如安装将其卸载。卸载命令 rpm -qa | grep mysql 2&#xff09;搜索MySQL文件夹&#xff0c;如存在则删除 find / -name mysql rm -rf /etc/s…

低代码赋能| 绿色智慧矿山解决方案

在世界能源日趋紧张的背景下&#xff0c;能源产业的数字化升级是大势所趋。矿山行业作为国家能源安全的“压舱石”&#xff0c;也必须进行产业升级。一直以来&#xff0c;国家都在大力推动智慧矿山建设。通过大数据、GIS、物联网、云计算、人工智能等新兴技术&#xff0c;实现矿…

Leetcode 461.汉明距离

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y&#xff0c;计算并返回它们之间的汉明距离。 示例 1&#xff1a; 输入&#xff1a;x 1, y 4 输出&#xff1a;2 解释&#xff1a; 1 (0 0 0 1) 4 (0 1 0 0)↑ ↑ 上面的…

Mysql redolog

一、redolog 是啥 数据库的ACID&#xff1a;A原子性&#xff0c;C一致性&#xff0c;I隔离性&#xff0c;D持久性&#xff1b; redolog&#xff1a;保证 持久性&#xff1b; redolog: 系统奔溃重启时需要按照上述内容所记录的步骤重新更新数据页&#xff0c;特点&#xff1a…

微服务架构七种模式

微服务架构七种模式 目录概述需求&#xff1a; 设计思路实现思路分析 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive.…

软件架构设计(三) B/S架构风格-层次架构(一)

层次架构风格从之前的两层C/S到三层C/S,然后演化为三层B/S架构,三层B/S架构之后仍然在往后面演化,我们来看一下层次架构演化过程中都有了哪些演化的架构风格呢? 而我们先简单了解一下之前的层次架构风格中分层的各个层次的作用。 表现层:由于用户进行交互,比如MVC,MVP,…

iOS脱壳之frida-ios-dump

frida-ios-dump介绍 该工具基于frida提供的强大功能通过注入js实现内存dump然后通过python自动拷贝到电脑生成ipa文件&#xff0c;适合现iOS11版本之后的越狱手机使用。 下载 https://github.com/AloneMonkey/frida-ios-dump环境安装 电脑环境安装 win和Mac 环境一样都是…

Metinfo6.0.0任意文件读取漏洞复现

漏洞原理 在\MetInfo6.0.0\app\system\include\module\的old_thumb.class.php文件 可以看到这里对./进行了严格的过滤&#xff0c;但是却忽略了在Windows下还可以用…\来跳转目录 环境搭建 下载Metinfo6.0.0 配置随便写&#xff0c;自己记住就行 这里前面已经审计过代码了&a…

linux离线环境安装redis

先检查gcc版本&#xff0c;使用gcc --version进行检查&#xff0c;版本在5以下的&#xff0c;安装redis要安装redis6以下的版本 如果没有gcc命令&#xff0c;要先安装gcc命令。因为是离线环境&#xff0c;yum命令什么的用不了。为了安装gcc&#xff0c;进行了几种尝试。 1、下…

Java设计模式:四、行为型模式-06:观察者模式

文章目录 一、定义&#xff1a;观察者模式二、模拟场景&#xff1a;观察者模式2.1 观察者模式2.2 引入依赖2.3 工程结构2.4 模拟摇号2.4.1 摇号服务接口2.4.2 摇号返回结果类 三、违背方案&#xff1a;观察者模式3.0 引入依赖3.1 工程结构3.2 添加摇号接口和实现3.2.1 摇号服务…

Nuxt 菜鸟入门学习笔记五:CSS 样式

文章目录 本地样式表在组件内导入通过 Nuxt 配置 CSS 属性导入使用字体导入通过 NPM 发布的样式表 外部样式表动态添加样式表【高级】使用 Nitro 插件修改渲染的头部 使用预处理器单文件组件 SFC 样式类和样式绑定使用 v-bind 的动态样式Scoped StylesCSS Modules预处理器支持 …

vue3中axios的使用方法

在Vue 3中使用axios发送HTTP请求的方法与Vue 2中基本相同。首先&#xff0c;需要安装axios库&#xff1a; npm install axios然后&#xff0c;在Vue组件中引入axios&#xff1a; import axios from axios;接下来&#xff0c;可以在Vue组件的方法中使用axios发送HTTP请求。例如…

基于金豺算法优化的BP神经网络(预测应用) - 附代码

基于金豺算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于金豺算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.金豺优化BP神经网络2.1 BP神经网络参数设置2.2 金豺算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…