数据库系统学习小记

关系型数据库

基于关系代数理论
缺点:表的结构不够直观,实现复杂且速度慢
优点:健壮性高,社区庞大
但在如今分布式系统的流行,健壮性要求并非那么高
第一范式:
符合1NF的关系中的每个属性都不可再分,是所有关系型数据库最基本的要求;

第二范式:在1NF的基础之上,消除非主属性对于码的部分函数依赖(满足1NF,表中的字段必须完全依赖于全部主键而非部分主键);

第三范式:在2NF的基础之上,消除非主属性对于码的传递函数依赖(满足2NF,非主键外的所有字段必须互不依赖);

BCNF范式:在 3NF 的基础上,消除主属性对于码的部分与传递函数依赖。

JOIN和GROUP BY

在这里插入图片描述
在这里插入图片描述

INNER JOIN: 如果查询的表中都有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行
UNION:合并多个SELECT 语句的结果集

Group by根据一个或多个列对结果集进行分组,例如聚合函数 (比如 SUM) 常常需要添加 Group by语句用于分组。
在这里插入图片描述

选择每个分类中 最便宜的商品 用聚合函数MIN()

在这里插入图片描述
如果还要加上显示产品名称,需要加子查询
在这里插入图片描述
在这里插入图片描述

事务和乐观锁

事务(transaction)
四特性ACID
Atomicity原子性(事务不可分割)
Consistency一致性(事务要满足所有约束)
Isolation独立性(事务之间要相互独立)
Durability持久性(事务的结果要持久)

事务的隔离级别(Isolation level)
Read Uncommitted(commit会把所有改动提交到数据库,不想改动可以rollback,Read uncommitted表示可以读到还没有被提交的数据)
Read Committed(表示只能读到已经被提交的数据)
Repeatable Reads(读到的是事务开始时的值)
Serializable(两个事务同时发生时的结果,必定等于两个事务先后发生结果中的一个)

现在要卖出productId为2的商品,将读操作和写操作作为两个事务分别执行(set autocommint=0表示不让其自动提交,需要手动commit,改动才可以写进数据库)(select @@tx_isolation可以查看隔离级别)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
提高事务的隔离级别试试:
set session transaction isolation level repeatable read;
在这里插入图片描述
一开始卖掉了一双鞋库存变49,另一个事务又将数量更新为48,由于隔离级别是repeatable-read,第二次读库存还是49。
在这里插入图片描述
再提高一个级别:
set session transaction isolation level serializable
在这里插入图片描述
此时库存已经update为48。另一个事务又将其改为47,会卡住:
在这里插入图片描述
因为即使只是读数据也会上锁,其他事务无法修改库存值。只有rollback之后才可以继续修改。

乐观锁(冲突不多时很有效)
读取数据,记录timestamp(本例中即 “and count = 47”)
修改数据
检查和提交数据
在这里插入图片描述
当另一个事务卖掉了一双鞋,该事务执行后影响了0行,即没有改变库存。
在这里插入图片描述

数据库常见问题

基础知识

实体:现实世界中客观存在并可以被区别的事物。比如“一个学生”、“一本书”、“一门课”等等。值得强调的是这里所说的“事物”不仅仅是看得见摸得着的“东西”,它也可以是虚拟的,比如说“老师与学校的关系”。

属性:教科书上解释为:“实体所具有的某一特性”,由此可见,属性一开始是个逻辑概念,比如说,“性别”是“人”的一个属性。在关系数据库中,属性又是个物理概念,属性可以看作是“表的一列”。

元组:表中的一行就是一个元组。

分量:元组的某个属性值。在一个关系数据库中,它是一个操作原子,即关系数据库在做任何操作的时候,属性是“不可分的”。否则就不是关系数据库了。

码:表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫候选码,我们从候选码中挑一个出来做老大,它就叫主码。

全码:如果一个码包含了所有的属性,这个码就是全码。

主属性:一个属性只要在任何一个候选码中出现过,这个属性就是主属性。

非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。

外码:一个属性(或属性组),它不是码,但是它别的表的码,它就是外码。
原文链接:https://blog.csdn.net/u013164931/article/details/79692402

介绍下关系型数据库的理论基础?

关系型数据库是建立在关系模型基础上的数据库,依靠表、字段等关系模型,结合集合代数等数学方法来处理数据。关系型数据的理论基础就是关系代数。

关系型数据库提出了第一范式到第五范式,一般做到第三范式或者BCNF范式。

第一范式:
符合1NF的关系中的每个属性都不可再分,是所有关系型数据库最基本的要求;

第二范式:在1NF的基础之上,消除非主属性对于码的部分函数依赖(满足1NF,表中的字段必须完全依赖于全部主键而非部分主键);

第三范式:在2NF的基础之上,消除非主属性对于码的传递函数依赖(满足2NF,非主键外的所有字段必须互不依赖);

BCNF范式:在 3NF 的基础上,消除主属性对于码的部分与传递函数依赖。

给定一个场景,请设计表结构?

表的设计至少要做到3NF的级别。即每个属性都不可再分,表中的字段必须完全依赖于全部主键而非部分主键,非主键外的所有字段必须互不依赖。

若有传递依赖关系,则应该打散开来,分成不同的表。

给定表结构,按要求写出SQL语句?

Join&Group by&子查询

什么是事务的ACID属性?事务有哪些隔离级别?

见上一节事务与乐观锁

数据库的索引

category表中索引:primary key(categoryId)
product表中索引:primary key(productId),foreign key(categoryId)
在这里插入图片描述

索引的实现:B树/B+树
二叉树优化的是比较次数,B/B+树优化的是磁盘读写次数

所以B/B+树的一个结点可以存放不止一个数据,而是一组数据,读写磁盘时也是一次性取出一个结点的那一组数据,这样就可以有效地节省磁盘读写次数。

B树的阶:每个结点最多的儿子数量
一颗m阶的B树定义如下:
1)每个结点最多有m-1个关键字。
2)根结点最少可以只有1个关键字。
3)非根结点至少有Math.ceil(m/2)-1个关键字(向上取整)。
4)每个结点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。
5)所有叶子结点都位于同一层,或者说根结点到每个叶子结点的长度都相同。
插入:
在这里插入图片描述
在这里插入图片描述
删除:
在这里插入图片描述
在这里插入图片描述

B+树
非叶子结点均是用来帮助索引,真正的数据全部都在叶子结点上,为了方便顺序访问,将叶子结点串起来。
在这里插入图片描述

数据库索引相关问题

数据库索引的作用

  1. 加快查找速度
  2. 约束数据的值,如UNIQUE INDEX, PRIMARY KEY, FOREIGN KEY

数据库索引的分类

  1. Clustered Index聚集索引,每个表至多一个,通常作为主键
    聚集索引定义了在数据库表中对记录进行物理排序的方式。就像书的目录一样,一旦数据存放完毕,目录就只有固定的一种了。
  2. Non-clustered Index非聚集索引
    非聚集索引是不对数据库记录进行物理排序的索引。 非聚集索引存储在与实际数据库表不同的位置。索引本身存储在一个位置,而数据本身则可能存储在其他各个不同的位置,可通过索引去找到。

B树和B+树的区别

B树的值可以存储在非叶子结点上,B+树真正存储的数据均在叶子结点上,其非叶子结点只是帮助索引,找到叶子结点上的数据。

且B+树的相邻叶子结点之间有指针连接,便于按存放顺序查找。

B树和二叉搜索树(红黑树)的区别

不同于二叉搜索树每个结点只存储一个数据,B树的每个结点可以存放一组数据,相当于磁盘中的一块内存区域。当每次读取磁盘中数据时,读取的是一块内存区域的数据,即B树中一个结点中的所有数据,这样做可以提升磁盘的读写效率。

而二叉搜索树的结构则是用于优化内存中的单个数据进行比较的次数。

数据库连接池

由于为每个用户或请求建立连接需要花费很多时间,而且每个用户建立连接也很容易造成浪费,所以数据库会事先准备好一个连接池,里面有一些建立好的连接。当web应用请求时,可以直接分配一个连接给它用,用完则释放连接并归还。
在这里插入图片描述
连接池的配置(Tomcat JDBC Connection Pool)
maxActive最大活跃连接数(默认100)
maxIdle最大空闲连接数(默认100)
minIdle最小空闲连接数(默认10)
initialSize初始建立连接数(默认10)
maxWait最大等待时间(默认30000,即30s)如来了第101个请求,超时则报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

maplesea7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值