0
点赞
收藏
分享

微信扫一扫

npm vs. pnpm vs. Yarn: 三者之间的区别与比较

莞尔小迷糊 04-15 21:00 阅读 1

数据库原理

码(键):码是一个或多个属性的集合,唯一标识元组的属性集。

候选码(后选键):任何一组可以唯一标识一行数据的最小属性集合

主码(主键):在多组候选码中选定的某一个

外码(外键):在关系R中的一个属性组,它不是R的候选码,但是它是另一个关系S的候选码,则称这个它为R的外码或外键。(另一个表的主键在我的表里,叫做外建

注意:一张表只能有一个主键,如果这个主键是由多个属性构成的,不叫多个主键,而叫一个联合主键。

其它:

主属性:任一候选码中的任意属性

非主属性:不在任意候选码中的属性,或者说除主属性以外的属性叫非主属性

超码:候选码加上其它非主属性构成的组合都叫超码,所以最小的超码就是候选码本身

全码:当所有的属性共同构成一个候选码时,这时该候选码为全码

什么是事务?

事务是数据库管理系统的执行过程的基本单位,由一组有限的数据库操作构成,这些操作要么全部执行,要么全都不执行,具有不可分割性。

ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

原子性:事务中的操作要么都发生,要么都不发生,不能只执行一部分

一致性:事务不能破坏关系数据的完整性约束。(目标/底线)

隔离性:多个事务并发访问时,每个事务都有各自的完整数据空间,一个事务不应该影响其它事务运行效果,

​ 违反可能造成以下结果:

​ 脏读:一个事务读取了另一个事务未提交的事务,而这个未提交的事务有可能回滚。(读了没提交的)

​ 不可重复读:是由于修改导致的,某个事务多次读取结果不一样。(读的过程中修改了)

​ 幻读:是由增加或者删除导致的,多次读取结果不一样。(读的过程中删除了)

​ 丢失更新:多个事务同时修改记录,导致修改记录被覆盖(丢失)的现象。(修改记录被覆盖)

​ 完全的隔离性是不现实的,这要求数据库同一时间只执行一条事务,会严重影响性能。所以针对不同需求,会设置不同的隔离级别。

持久性:在事务完成以后,该事务所对数据库所作的更改便持久地保存在数据库之中,并不会被回滚。

举例子:转账不能转一半停止(原子性)、转账前后两账户总额不变(一致性)、事务提交后,即使服务器断电也能恢复数据(持久性)

总结:保证数据“一致性”是最终目标,其三个的都是手段

  1. 实体完整性:实体完整性确保每个表中的。这通常通过主键(Primary Key)来实现,主键是一个唯一标识符,用于标识表中的每一行。

  2. 参照完整性:是指,保证了表之间的数据的一致性,通常通过外键来实现。

  3. 用户定义的完整性:用户定义的完整性允许数据库管理员或应用程序开发人员定义自定义的完整性规则。这些规则可以基于特定的业务需求来制定,以确保数据的合法性和一致性。

是什么?

一组完整性规则的集合,它是数据和数据间的联系所具有的的制约条件

  • 实体完整性:实体要存在,每一行都具有唯一的标识符,通常通过主键实现。
  • 域完整性:表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。 (范围明确)
  • 参照完整性:参照物要存在,数据关系中不能引用不存在的实体,也就是说两个表的主关键字和外关键字的数据应一致,通常用外键实现。
  • 用户定义完整性:用户必须满足自己定义的约束条件,比如约定了学生成绩不得高于100分
Dirty Read 脏读NonRepeatable Read 不可重复读Phantom Read 幻读
Read uncommitted 未提交读
Read committed 提交读X
Repeatable read 可重复读XX
Serializable 序列化XXX

四个隔离级别:

1.读未提交:就是一个事务可以读取另一个未提交事务的数据,显示的数据可能是未提交的。可能会造成脏读取、不可重复读、幻读

2.读已经提交:就是只能读到已经提交了的内容,读操作要在事务操作提交之后才能取到数据,可以避免脏读取。

3.可重复读:mysql的默认隔离级别,读事务启动时不允许其它修改事务执行操作,可以避免修改造成的不可重复读,但还有可能幻读。

4.序列化:这是数据库最高的隔离级别,事务只能一个一个按顺序执行,性能开销也最大,所以基本没人会用。

拓展:sql server 和oracle的默认级别是读已提交

什么是锁?

数据库锁是数据库用于管理并发事务的一种机制(工具),事务获得了某些资源的锁后,才能拥有对这些资源的控制权,在没有释放锁之前,其它事务都不能更新这些资源数据。

大体上可以分为乐观锁和悲观锁。

悲观锁:很悲观地认为每次取数据时都数据都可能被修改,所以每次在处理数据的全过程(读、修改、写)都会上锁

实现方式:用数据库底层自带的锁实现,给语句加for update(悲观锁)/lock in share mode(乐观锁)

特点:很安全,但性能很低,因为大多数时候各个事务仅仅在读数据,并不需要锁住

适合场景:读操作不频繁,写操作频繁的时候

**乐观锁:**乐观地认为读操作时不会被修改,读操作时不上锁,只有更新(写)操作时上锁

实现方式:给数据库加版本号/时间戳,每次操作数据都对版本号(时间戳)更新,取数据时对比当前数据最新版本号(时间戳)来判断是否发送错误

适合场景:少写、多读场景

总结:什么操作需要加锁,那么这个锁就适合用在这个操作比较少的场景(不要让锁频繁起效,会影响性能!)

另外,从锁是否被独占的角度来看,还分为共享锁和排它锁;从锁的粒度来看,还分为行级锁和表级锁等等

有哪些?

错误日志:记录了数据库运行过程中发生的错误

数据库查询日志:数据库的查询日志记录了所有sql语句

慢(很慢)查询日志:保存那些经常执行超时的语句

二进制日志:主要是记录所有的增、删、改的语句,包括增加删除、修改,但不包括查询语句

数据库索引是一种能够帮助数据库标识排序某列数据的一种数据结构(列表),使用索引后可以不需要扫描全表来获取某一行的数据,能大大提高查找效率,但相应的也会增大开销,因为索引表本身要占空间,且修改表的时候可能对应索引表也修改。

比如对表里的某一列添加一个索引,就意味着查找这列的某个值时,可以通过索引表来快速定位,这个值对应的所在行数。

索引分类?

普通索引:没有任何约束的索引

唯一索引:不存在两个相同的索引值,要求键值唯一但可以为空

主键索引(聚集索引):主键列对应的索引,一般指定主键后数据库系统会自动创建,键值要求唯一且非空

全文索引:基于分词的索引,能够快速查询数据量较大的字符串类型的字段,效率比一般的模糊查询高。

索引具体实现方式有哪些?

hash索引、B+索引

索引适合用在哪些字段上?

唯一性好、更新不频繁的字段

触发器是保证数据库完整性的一种机制,可以定义一组操作,在满足某个条件时才触发,而不是程序员主动触发。

有如下特点:

(1) 自动执行:触发器在操作表数据时立即被激活。

(2) 级联更新:触发器可以通过数据库中的相关表进行层叠更改。

(3) 强化约束:触发器可以引用其他表中的列,能够实现比CHECK约束更复杂的约束。

冗余低:由于文件之间缺乏联系,相同的数据常常在不同的文件中重复存贮。但是在数据库中,可以设计出冗余非常低的数据库结构。

共享性高:文件系统的共享是以文件为单位的,很难实现文件内容之间的关联。而数据库的共享单位是文件记录,通过sql就可以把数据库中的各个字段关联起来。

数据独立性高:文件的逻辑结构改变时,应用程序必须改变,同时修改文件结构的定义。但数据库的逻辑结构改变时,只需要改变外模式/模式的映射关系。

  • 概念模型(ER图来表示),主要用于设计数据库
  • 逻辑模型(具体表结构表示),如层次模型、网状模型、关系模型,用于数据库管理系统的实现
  • 物理模型,数据库在计算机中的存储方式和存取方法,用户只需要选择模型,不需要关心具体实现

数据模型:数据结构+数据操作+数据的完整性约束,逻辑模型分类就是由数据结构的不同来分的,有层次、网状、关系模型(重点)

注意:关系=表;关系名=表名元组=一行

%代表0个或者多个字符

_代表一个字符

一个分布式系统不能同时满足一致性、可用性和分区容错性这三个需求,最多只能同时满足两个。

  • 一致性(Consistency) (所有节点在同一时间具有相同的数据)
  • 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
  • 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

第一范式:表中的每一列都具有原子性,不可再分

例子:某一列属性的内容是一个集合,如爱好里面写了好几个爱好

解决办法:将属性拆分

第二范式:非主属性完全依赖于主键,不存在属性只是依赖于部分的主属性的情况(非主属性要完全依赖)

例子:假定选课关系表为SelectCourse(学号, 姓名, 课程号, 学分),因为只有学号+课程号才能唯一标识一行数据,所以主键是【学号+课程号】,而姓名依赖于学号,学分依赖于课程号,存在部分依赖,所以不满足2NF。

不满足时的坏处:(冗余+插入受限+连带删除)

  • 部分依赖的非主属性会有数据冗余
  • 插入异常,部分依赖的那些属性,它们的数据添加会受到主键整体的影响,但其实不应该受到影响。比如当课程还没人选的时候,主属性的课程号为空,但导致学生信息也无法导入
  • 部分依赖的属性删除时会受到牵连,但其实不应该删除,因为没依赖关系

解决办法:分表,使属性得完全依赖于主键。当用多个属性作为主键时候,一定要保证完全依赖。

第三范式:在第二范式的基础上规定依赖必须是直接依赖,不能是间接依赖(非主属性要直接依赖)。一般说来,数据库只需满足第三范式(3NF)就行了。

例子:学生表Student(学号,姓名,学院,学院地址),主键为学号,因为学院依赖于学号,而学院地址又依赖于所在学院,所以学院是间接依赖于学号,不满足3NF。

不满足时坏处:(和2NF对应,冗余+插入受限+连带删除)

  • 传递依赖的属性有冗余,比如一个学院包含多个学生,那学院地址就会有很多冗余
  • 插入数据受限制,会受到学号的影响
  • 传递依赖的属性,删除时会受到牵连,但其实不应该

解决办法:分表

BC范式:在3NF基础上,规定包括主属性在内**,所有属性**都不能部分依赖或者间接依赖于于主键(任意属性要完全+直接依赖)

例子:表(A,B,C,D),(A,B,C)是主键,D完全依赖于(A,B,C),但是C只依赖于B,而不是依赖于(A,B),这样就违背了BCNF

第四范式:在第三范式的基础上消除了多值依赖,多值依赖也就是表中存在多组一对多关系,而这些部分又是相互独立的。

例子:比如授课表(教师编号、课程编号、参考书号),主键是三个属性加起来,三者分别都完全依赖于其它两个属性,满足BCNF,但是教师和课程是一对多关系,教师和参考书也是一对多关系,但课程和参考是相互独立的,这就不满足4NF

坏处:冗余

解决办法:分表

总结:

第一范式(1NF)
非码的非平凡 | ↓ 消除非主属性对码的部分函数依赖
第二范式(2NF)
↓ 消除非主属性对码的传递函数依赖
第三范式(3NF)
↓ 消除主属性对码的部分和传递函数依赖
BC范式(BCNF)
↓ 消除非平凡且非函数依赖的多值依赖
第四范式(4NF)
↓消除不是由候选码所蕴含的连接依赖
第五范式(5NF)

存储过程是一组进过预编译的SQL语句集,可以封装特定功能。优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以多次复用。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要。(封装好的sql函数,核心是速度快、可复用)

使用方法:用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

优点:经过预编译,速度快可复用;有权限管理,安全性高;通过名称调用,减少了网络通讯

调用方式:

1)可以用一个命令对象来调用存储过程。

2)可以供外部程序调用,比如:java程序。

  • delete删除表中的部分数据,一般会加where字句限定删除范围。
  • drop是直接删掉整张表,包括删除表结构
  • truncate删除表中全部数据

delete属于数据库操作语言,可以回滚,但drop和truncate是数据库定义语言,不能回滚,操作即生效。

分类:

DDL-数据定义语言:建表、删表,提交后立即生效,不支持回滚

DML-数据库操作语言:增删改数据,可以回滚

DQL-数据库查询语言:查询select

DCL-数据库控制语句:比如授权语句grant

对某一组(列)数值进行计算,然后返回一个单独的值的函数。

比如count函数返回记录个数,avg统计平均值,sum求和,最大最小值等等

where和having的区别?

  • where表达式后面不能有聚合函数,而having可以有
  • where在group by之前,而having一定在group by之后

group by用于分组,需要结合聚合函数一起用,比如求每个学生的选课总数

select 学号, count(course_id) as 选课总数 from A group by 学号

执行先后顺序:where 、group by、having、order by,先查询,再分组,再加条件,最后再排序

三级模式是站在数据库开发人员的角度看来,数据库系统的内部结构

img

1.1 用户级–> (用户)外模式(反映了数据库系统的\用户观\,用户能看见的部分逻辑结构的表示)

外模式又称子模式或用户模式,对应于用户级。外模式是从模式导出的一个子集,包含模式中允许特定用户使用的那部分数据。是模式(逻辑结构)在应用程序上面的表示,也就是用户在应用程序上所能看到的数据视图(经过处理的)。可以利用数据操纵语言(DML)对这些数据记录进行操作。

1.2 (核心)概念级–> (概念/逻辑)模式(数据库系统的\整体观,逻辑关系)

概念模式又称模式或逻辑模式,对应于概念级。是对数据库中全部数据的逻辑结构和特征的总体描述,由数据描述语言(DDL)来描述、定义。

1.3 物理级 --> (存储/子)内模式(反映了数据库系统的\存储观\,数据的物理结构/存储方式)

内模式又称存储模式,对应于物理级。它是数据库中全体数据的底层描述,描述了数据在存储介质上的存储方式和物理结构。内模式由内模式描述语言来描述、定义的。

总结:

  • 总之,数据按外模式的描述呈现给用户(用户视图);按概念模式来进行逻辑设计(逻辑结构);按内模式的描述存储在磁盘上(物理结构)。
  • 一个模式可以对应多个外模式。模式和内模式是一一对应的,是逻辑结构和物理结构的关系。

img

两级映射作用:让数据有较高的物理和逻辑结构性,保证外模式(应用程序内容)的稳定性

外模式/模式映射:修改模式的逻辑结构时,只需要修改映射关系,不用修改外模式内容,保证了数据有较高的逻辑独立性

模式/内模式映射:修改内模式物理结构时,只需要修改映射关系,不用修改模式保持不变,保证了数据有较高的物理独立性

1、并:设有两个关系R和S,它们具有相同的结构。R和S的并是由属于R或属于S的元组组成的集合,运算符为∪。记为T=R∪S。

2、交:R和S的交是由既属于R又属于S的元组组成的集合,运算符为∩ [1] 。记为T=R∩S。R∩S=R-(R-S)。

3、差:R和S的差是由属于R但不属于S的元组组成的集合,运算符为- [1] 。记为T=R-S。

4、选择:从关系中找出满足给定条件的那些元组。其中的条件是以逻辑表达式给出的,值为真的元组将被选取。这种运算是从水平方向抽取元组。

5、投影:从关系模式中挑选若干属性组成新的关系。这是从列的角度进行的运算,相当于对关系进行垂直分解。

6、笛卡尔积(乘法):表示为X与Y相乘,第一个对象是X的成员,第二个对象是Y的所有可能有序对的其中一个成员;

笛卡尔积就是多个数据集合的乘积,也就是从每个数据集合中任意取一个,所有可能组成的结果,结果是是一张二维表。一般来说笛卡尔积需要去除无效数据具有现实意义。

比如:如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。

因为对增加删除修改操作会写入数据库日志中,所以只能查询数据,不能增加删除修改数据

nosql一般指的是非关系型数据库,也可以理解为not only sql,即数据库管理技术不仅仅有sql。

nosql采用极其简单的数据模型来存储、管理数据,可以提高数据库的存储能力和并发能力,是为解决大数据应用难题而生的一类数据库。

nosql分类:key-value存储数据库(Redis)、文档存储数据库(MongoDB)、列存储数据库

第一种情况:数据冗余
假如数据库中两个表都放了用户的地址,在用户的地址发生改变时,如果只更新了一个表的数据,那么两个表就有了不一致的数据。

第二种情况:并发控制不当

假如在飞机票订票系统中,如果两个购票点同时查询某张机票的订购情况,而且分别为订购了这张机票,如果并发控制不当,就会造成同一张机票卖给两个用户的情况。由于系统没有进行并发控制或者并发控制不当,造成数据不一致。

第三中情况:故障和错误

如果软硬件出现故障或者操作错误导致数据丢失或数据损坏,引起数据不一致。因此我们需要提供数据库维护和数据库数据恢复的一些措施。
要根据各种 数据库维护 手段(如转存、日志等)和 数据恢复 措施将 数据库恢复 到某个正确的、完整的、一致性的状态下。

视图是一种虚表,通过视图也可以查询数据修改数据

视图定义:create view 视图名 as [select语句]

作用:

  • 可以提高sql语句的重用性,更方便使用。比如要频繁获取某几个表的某些数据时,可以用creat view定义一个视图,然后需要取数据的时候再用select语句从view中取,不用每次写sql都指定条件。
  • 很灵活。逻辑结构改变时,不修改数据表结构,只修改视图,可以做到不影响程序运行。
  • 更安全。可以限制特定用户只能获取部分数据
举报

相关推荐

0 条评论