1. 数据库中的简单属性、多值属性、复合属性、派生属性
简单属性:指不能够再分解成更小部分的属性,通常是数据表中的一个列。例如学生表中的“学号”、“姓名”等均为简单属性。
多值属性:指一个属性可以有多个值。例如一个学生可能会有多个电话号码,这种情况下“电话号码”就可以被视为是多值属性。
复合属性:是由两个或多个简单属性组合而成的属性。例如:“家庭住址”记录了邮编、省、市、街道信息,则“家庭住址”这个属性就为复合属性。
派生属性:是指其值可以通过其他属性的值计算得出的属性。例如:一个“年龄”属性可以通过当前日期减去“出生日期”属性的值来计算得出。
2. 并发控制中事务的特性(ACID)
原子性(Atomicity):事务是原子的,要么做,要么都不做。
一致性(Consistency):事务执行的结果必须保证数据库从一个一致性状态变到另一个一致性状态。
隔离性(lsolation):事务相互隔离。当多个事务并发执行时,任一事务的更新操作直到其成功提交的整个过程,对其它事物都是不可见的。
持久性(Durability):一旦事务成功提交,即使数据库崩溃,其对数据库的更新操作也永久有效。
3. 三级模式结构
视图——用户视图——外模式
基本表——概念视图——模式(概念模式)
存储文件——内部视图——存储模式
外模式 与 概念模式 映射➡逻辑独立性
概念模式 与 内模式 映射➡物理独立性
4. 关系模式中的候选关键字与如何分解为无损连接并保持函数依赖的解法
求属性的闭包:对于每一个函数依赖Y → Z(其中Y是属性集合,Z是单个属性),如果Y是X闭包的子集,那么将Z添加到X的闭包中。
遇到这种类型题,直接求四个选项的闭包即可:
候选关键字中的属性,可以推导出关系中的所有其他属性,且可能有多个候选关键字。
还有一个解法就是会发现题目中的函数依赖没有可以推出属性C的依赖,所以候选关键字中必定会含有属性C,故选D。
利用表格法来解题(举例):
- 构造一个表格,其中行代表分解后的关系模式,列代表原始关系模式的所有属性。
- 表格中的每个单元格,如果属性属于对应的关系模式,则填充为该属性的标记(例如a),如果不属于,则填充为b加上行号和列号的组合(例如b12)。
- 根据函数依赖集F,逐步更新表格中的值。如果某个函数依赖的左侧属性在表格的某列中具有相同的值,那么将这个函数依赖的右侧属性在相同行中的值也更新为相同的值。
- 如果在任何时候,表格中出现一行,其所有单元格都是属性标记(没有b),则说明分解是无损的。
假设我们有一个关系模式 R(A,B,C,D,E),并且我们有以下函数依赖集 F={A→B,C→D}F={A→B,C→D}。现在,我们将 R 分解为三个关系模式 R1(A,B),R2(B,C),和 R3(A,D)。我们要判断这个分解是否是无损的。
步骤 1:构造表格
我们首先构造一个表格,行表示分解后的关系模式,列表示原始关系模式的所有属性。在这个例子中,我们有 3 行 4 列:
A | B | C | D | E | |
---|---|---|---|---|---|
R1 | a1 | a2 | b13 | b14 | b15 |
R2 | b21 | a2 | a3 | b24 | b25 |
R3 | a1 | b32 | b33 | a4 | b35 |
步骤 2:填值
- 表格中的a1,a2,a3,a4表示这些属性直接来自分解模式的属性。
- b13,b14,b21,b24,b32,b33表示这些属性不在当前行的分解模式中,但它们在其他分解模式中存在。
步骤 3:应用函数依赖
接下来,我们根据函数依赖集F来更新表格中的值:
-
应用 A→B:
- 因为 a1 在 R1 和 R3 中,我们将 R3 中的 b32 更新为 a2。
-
应用 C→D:
并没有出现含有相同元素的行,故结束
更新后的表格如下:
A | B | C | D | E | |
---|---|---|---|---|---|
R1 | a1 | a2 | b13 | b14 | b15 |
R2 | b21 | a2 | a3 | b24 | b25 |
R3 | a1 | a2 | b33 | a4 | b35 |
步骤 4:检查是否无损
现在我们检查表格中是否有任何一行完全由 a 标记组成。在这个例子中,并没有任何一行是完全由a标记组成的,故不是无损连接分解。
两个月冲刺中级软件设计师,欢迎大家一起讨论交流,同时也希望各位大佬们指出错误,我这边及时修改。