整理网上常见的数据库问题,方便自己和有需要的人学习。
1.事务
概念可能访问和操作各种数据项的数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。 事务由在事务开始和结束期间执行的所有数据库操作组成,包括满足ACID特性
2.ACID特性
“原子”(Atomicity ) :事务中的所有操作都不能在数据库中拆分。 要么全部完成,要么全部不执行。
一致性并行执行的多个事务的执行结果必须与按一定顺序串行执行的结果相匹配。
执行隔离事务不受其他事务的干扰,并且执行事务的中间结果必须对其他事务透明。
对于“持久性”(Durability ) :已提交的事务,必须确保即使数据库发生故障,事务对数据库的更改也不会丢失。
注:关于事务的ACID特性,DBMS采用日志来保证事务的原子性、一致性和持久性日志记录事务对数据库所做的更新。 如果在执行事务时发生错误,则可以根据日志撤消事务对数据库的更新,并将数据库回滚到执行事务之前的初始状态。
单用户串行数据库操作没有隔离问题,但如果多用户同时操作数据库,则存在并发一致性问题(读者可以思考一下不同的读写操作可能会引起哪几种不同的并发问题),这是致命的,因此必须满足事务隔离性。DBMS是采用锁机制来实现事务的隔离性的如果多个事务同时更新数据库中的同一数据,则只有拥有锁定的事务才能更新数据。 其他事务在上一个事务解除锁定之前无法更新数据。(可以结合操作系统中的同步互斥问题一起学习)
3.数据库的3级模式
外部模式:外部模式也称为子模式或用户模式,对应于用户级。 这是某个或某几个用户所看到的数据库的数据视图,是关于某个APP应用的数据的逻辑表示。 概念模式:也称为模式或逻辑模式,对应于概念级。 这是数据库设计者集成所有用户的数据,在统一观点的基础上构建的全局逻辑结构,为对数据库中全部数据的逻辑结构和特征的总体描述,是所有用户的公共数据视图(全局视图)。 内部模式:也称为存储模式,支持物理级。 这是数据库中所有数据的内部表示或底层描述,数据库的最低级别逻辑描述,描述了数据在存储介质上的存储方式和物理结构对应于实际存储在外部存储介质上的数据库。 注:定义数据库时,内部架构和概念架构是唯一的,但在数据库系统上构建的APP应用程序非常广泛和多样,因此相应的外部架构不唯一,也不唯一。
4.视图
视图是从一个或多个基本表(或视图)导出的虚拟表。 系统的数据字典只包含视图定义,不包含与视图对应的数据。
视图是原始数据库数据的转换,也是显示表中数据的另一种方式。 可以将视图视为移动的窗口,可以看到感兴趣的数据。 视图来自存储在数据库中的一个或多个实际表。 用于生成视图的表称为视图的基表。 一个视图也可以从另一个视图生成。 视图技术在数据库设计中很有用,可以提高用户交互的效率,提高数据库的安全性。5.数据库中的各种键(码)
数据库中的密钥(key )也称为代码,是关系模型的重要概念之一,它是逻辑结构,不是数据库的物理结构
一个关系(表)包含一个或多个属性(表)中的列,通过该关系可以唯一地标识每个元组(表)中的行。 这些属性是键(即代码),细分如下:
超级密钥:唯一标识元组的属性(集)。 一个属性可以是一个超级密钥,多个属性的组合可以是一个超级密钥。 候选密钥:候选密钥有两个要求。 1 .确保在关系中唯一识别元组。 2 .在属性集中找不到符合条件的真子集。
第一个条件是超级密钥的标准,因此候选密钥可以视为不能再“缩小”的超级密钥、最小的超级密钥。 “主键”(primary key )表示关系中的一个候选键。 主键不能为空值,也不能重复。 一个关系中可能有多个候选键,但只能选择一个作为主键! 在E-R图中,主键由属性名称加下划线表示。 外键:在关系a中,一个属性b不是关系a的主键或候选键,但它是另一个关系b的主键。 在这种情况下,属性b是关系a的外键。
主键和外键是数据库设计中最常用、最熟悉的! 注意:在学习函数依赖关系时,通过在函数依赖关系中定义键可以更好地理解。
6.正确认识数据冗余
>主键与外键在多表中的重复出现, 不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚(没错我也不清楚~)。**非键字段的重复出现, 才是数据冗余!**而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。〖举个栗子〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。
7.函数依赖(稍微复杂一点,需静心!实在看不下去可跳过,感觉不会太重点问这种难理解的抽象理论知识)
定义:若关系R的任意两个元组在属性A1、A2、…、An上一致(即有相同分量值),则这两个元组在属性B上也一致,则称属性A1A2…An函数决定B,或称B函数依赖于A1A2…An 。 记为 A1A2…An → B
怎样分析一个具体关系中的函数依赖:
1.根据实体属性之间的语义关系分析函数依赖
2.应考虑所有可能的属性组合
3.尽可能使函数依赖式的左面(A)最小化,右面(B)最大化。
部分函数依赖:若X → Y,且存在X的真子集X’, X’→ Y,则称Y对X部分函数依赖。
完全函数依赖:若X → Y,且Y对X不是部分函数依赖,则称Y对X是完全函数依赖。
传递函数依赖:若X → Y,Y → Z,且Y → X,则称Z对X是传递函数依赖。
用函数依赖再次理解一下键
定义:对于关系R,若属性集合{A1,A2,…,An}满足下列条件,则该属性集合是R的一个键key:
1.A1,A2,…,An函数决定R中所有其他属性。(超键)
2.{A1,A2,…,An}的任何真子集都不能函数决定R中所有其他属性。(最小化=候选键)
注:函数依赖的定义是形式化的定义,而E/R模型中键的定义是一种非形式化的语义说明。二者是一致的。
什么是函数依赖规则:在一个给定关系上,已知一组函数依赖作为前提条件。根据一组函数依赖规则,推断另一些函数依赖。为何需要函数依赖规则:可以根据函数依赖的计算和验证来有效地减少冗余,得到良好的关系设计。常见的函数依赖规则:分解/合并规则、平凡依赖规则、传递规则、Armstrong公理注:具体就不仔细讲解了,大家有兴趣查阅查阅别的资料吧!两个函数依赖集合之间有何关系:
1.设T是关系R上的函数依赖集,若对R的所有实例,函数依赖X → Y都成立,则称T“逻辑蕴含” X → Y。(X → Y可由T推导出来)
2.设S是关系R上的另一函数依赖集,若对R的所有实例,S中的所有函数依赖均成立,则称函数依赖集S“蕴含于”函数依赖集T。(S可由T推导出来)
3.若函数依赖集S“蕴含于” T,同时T“蕴含于”S,则函数依赖集S“等价于”函数依赖集T。蕴含和等价关系有何用处
1.可用等价的更简单的函数依赖集代替复杂的函数依赖集。
2.可在一个函数依赖集S中增加蕴含其中的其它函数依赖。
3.可判断一个函数依赖是否蕴含于已知的函数依赖集。
8.异常
什么是异常:即数据库设计不符合规范,在操作数据库时,影响数据一致性。主要有下列三种异常?
9.范式
范式理论是为了规范数据库的设计,解决以上异常的。高级别的范式依赖于低级别的范式,1NF是最低级别的范式。
注:基本表及其字段之间的关系,应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是最好的设计。为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的(这在算法中也是经常借鉴的,所以学习需要我们经常思考,寻找更优解!)。也就是讲数据冗余时我们所说的提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。
10.E-R图
这个学过数据库都应该比较熟练了,简单回忆一下即可。别到时候问到了说不上来。
关系实体图(Entity-Relationship),有三个组成部分:实体、属性、联系。用来进行关系型数据库系统的概念设计。
实体:用矩形表示,矩形框内写明实体名。(还有弱实体,用双矩形表示,了解即可。)属性:用椭圆形表示,并用无向边将其与对应的实体连接起来。联系:用菱形表示,菱形框内写明联系名,并用无向边分别有关实体连接起来。同时在无相边旁标上联系的类型(1…1、1…* 、* … *)即一对一、一对多、多对多关系。11.ER模型转换为关系模型的原则(重要!)
一对一:遇到一对一关系的话,在两个实体任选一个添加另一个实体的主键即可。一对多:遇到一对多关系的话,在多端添加另一端的组件。多对多:遇到多对多关系的话,我们需要将联系转换为实体,然后在该实体上加上另外两个实体的主键作为联系实体的主键(如学生选课表S-C),然后再加上该联系自身带的属性即可。这样将一个多对多关系分解成了两个一对多关系,要善于解决多对多关系。12.索引
树是学习数据结构时最重要的数据结构之一,在查找算法中,我们学过B-树和B+树,索引即查找,同样可用B-树和B+树进行。
B-树:(Balance-Tree):也称为多路平衡查找树,所有的叶子节点位于同一层。B+树:它不仅具有B-树的平衡性,并且可以通过顺序访问指针来提高区间查找的性能。它们的最大区别是,B+树的非叶子结点不保存数据,只用于索引,所有的数据都保存在叶子节点中,并且叶子结点间按照从小到大顺序链接起来。这也是为什么SQL数据库会采用B+树来进行索引。相同的外存空间,用B+树数据结构进行索引能装下更多数据,索引速度更快。(参见《数据结构》)
13.触发器
一个触发器是存储在某个表中的一个命名的数据库对象。当该表进行某种数据更新时,将自动触发一组SQL语句的执行。使用触发器可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。触发器不要设计的太复杂。