草庐IT

MySQL第1章——数据库概述

xiaozhi-jun 2023-03-28 原文

数据库概述

为什么要使用数据库

什么是数据持久化?

数据持久化就是把数据保存到可掉电式存储设备中供以后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通过各种关系数据库来完成。

持久化的主要作用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。

为什么用数据库来存储数据?

  • 数据库的特点:
    • 数据库存储的数据量非常庞大。以单表来说,我们可以存储几千万甚至上亿条数据。与文件存储相比,当数据量特别庞大的时候,数据库查询数据的效率更高。
    • 数据库存储数据的类型更更富。例如整数类型、浮点类型、字符串类型,甚至是图片,大文本等等。
  • 文件存储的弊端:有些文件需要特定的程序才可以打开。例如,excel。

数据库和数据库管理系统

数据库、数据库管理系统、结构化查询语言

  • 数据库(Database,DB):DB是存储数据的“仓库”,其本质是一个文件系统。
  • 数据库管理系统(Database Management System,DBMS):DBMS是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制。用户通过数据库管理系统访问数据库中数据表的数据。
  • 结构化查询语言(Structured Query Language,SQL):SQL是专本用来与数据库通信的语言。

数据库与数据库管理系统的关系

数据库管理系统可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。为了保证应用中实体的数据,一般会在数据库创建多个数据表,以保证程序中实体用户的数据。

客户通过Web服务器访问数据库管理系统,数据库管理系统通过SQL访问数据库中的数据表。

常见的数据库管理系统

常见的DBMS有Oracle、MySQL、SQL server、Db2、PostgreSQL等。

MySQL介绍

RDMBS与非RDBMS

RDBMS

关系型数据库(RDBMS):RDBMS是最古老的数据库类型,它把复杂的数据结构归结为简单的二元关系(二维表格形式)。

  • RDBMS以行(row)和列(column)的形式存储数据,以便于用户理解。一些列的行和列被称为表(table),一组表组成一个库(database)。
  • 表和表之间存在关系。关系型数据库就是建立在关系模型基础上的数据库。
  • SQL就是关系型数据库的查询语言。

关系型数据库的优势:

  • 便于复杂查询:可以使用SQL语句方便在一个或多个表之间进行复杂的查询。
  • 支持事务:使得对于安全性能要求很高的数据访问要求得以实现。

非RDBMS

非关系型数据库(非RDBMS):可以看成是传统关系型数据库的功能阉割版本,基于键值对存储数据,不需要SQL层的解析,性能非常高。同时,通过减少不常用的功能,进一步提高性能。

目前基本大部分主流的非RDBMS都是免费的。

非关系型数据库的分类:

  • 键值型数据库:键值型数据库通过Key-Value键值的方式来存储数据。在查找速度上优于关系型数据库;但是无法像关系型数据库一样使用条件过滤。键值型数据库常在内存缓存中使用。Redis是代表性的键值型数据库。
  • 文档型数据库:文档型数据库可以存放并获取文档,可以是XML、JSON等格式。一个文档相当于一条记录。文档数据库所存放的文档,就相当于键值数据库所存放的“值”。MongoDB是最主流的文档型数据库。
  • 搜索引擎数据库:虽然关系型数据库采用了索引提高检索效率,但是针对全文索引的效率却较低。搜索引擎数据库是应用在搜索引擎领域的数据存储形式,由于搜索引擎会爬取大量的数据,并以特定的格式进行存储,这样在检索的时候才能保证性能最优。核心原理是“倒排索引”。Elasticsearch是最主流的搜索引擎数据库。
  • 列式数据库:可以大量降低系统的I/O,适合于分布式文件系统。典型的列式数据库:HBase。
  • 图形数据库:典型的图形数据库:Neo4J等。

关系型数据库设计规则

E-R(实体-联系)模型

E-R(实体-联系)模型:

  • 实体集
  • 属性
  • 联系集

一个实体集对应一个表;一个实体对应一行,也叫一条记录;一个属性对应一列,也叫字段。

表的关联关系

一对一关系

  • 在实际开发中应用不多,因为一对一可以创建一张表。
  • 举例:设计学生表:学号、姓名、手机号、班级、系别、身份证号码、家庭住址、籍贯、紧急联系人、...
    • 拆分成两个表:两个表的记录是一一对应关系。
    • 基础信息表(常用信息):学号、姓名、手机号码、班级、系别
    • 档案信息表(不常用信息):学号、身份证号码、家庭住址、籍贯、紧急联系人、...
  • 两种建表原则:
    • 外键唯一:
    • 外键是主键:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一。
    • 外键是主键:主表的主键和从表的主键,形成主外键关系。

一对多关系

  • 常见实例场景: 客户表和订单表 , 分类表和商品表 , 部门表和员工表 。
  • 举例:
    • 员工表:编号、姓名、...、所属部门
    • 部门表:编号、名称、简介
  • 一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键

多对多关系

要表示多对多关系,必须创建第三个表,该表通常称为联接表,它将多对多关系划分为两个一对多关系。将这两个表的主键都插入到第三个表中。

  • 举例1:学生-课程
    • 学生信息表 :一行代表一个学生的信息(学号、姓名、手机号码、班级、系别...)
    • 课程信息表 :一行代表一个课程的信息(课程编号、授课老师、简介...)
    • 选课信息表 :一个学生可以选多门课,一门课可以被多个学生选择

  • 举例2:产品-订单

    “订单”表和“产品”表有一种多对多的关系,这种关系是通过与“订单明细”表建立两个一对多关系来定义的。一个订单可以有多个产品,每个产品可以出现在多个订单中。

    • 产品表 :“产品”表中的每条记录表示一个产品。
    • 订单表 :“订单”表中的每条记录表示一个订单。
    • 订单明细表 :每个产品可以与“订单”表中的多条记录对应,即出现在多个订单中。一个订单可以与“产品”表中的多条记录对应,即包含多个产品。

  • 举例3:用户-角色

    多对多关系建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。

自我引用

有关MySQL第1章——数据库概述的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  3. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  4. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  5. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  6. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  7. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  8. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  9. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  10. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

随机推荐