数据库的三大范式(原理 + 例子详解)

第一范式:列原子性。
列不能拆分。
单价和折扣价是分开的。
时间:不确定。
地点:不确定。
数量:不确定。

第二范式:列完全取决于主键。
共享主键必须是完全依赖的。
产品名称,共享单价。
时间:不确定。
地点:不确定。
数量:不确定。

第三范式:列直接依赖于主键。
没有间接依赖性。
用户名、共享用户 ID。
时间:不确定。
地点:不确定。
数量:不确定。

实际发展视情况而定。
允许冗余。

数据库的三大范式(原理 + 例子详解)

上周,一位客户问我三个主要数据库是什么,我详细解释了它们。

首先我们需要谈谈第一个例子。
最主要的是保证数据的可见性。
你是什​​么意思?即每一列只能包含一个属性,不能有复合属性。
例如,如果表中有“价格”列,则结果将同时包括商品价格和折扣价,这违反了原来的标准形式。
正确的做法是将“价格”分为“单价”和“折扣价”两列,每一列只包含一个属性。

然后是第二个标准形式。
这比原来的标准形式更进一步,要求每一列都依赖于主键。
简单来说,所有非主键列都必须与主键直接相关。
例如,表的主键是“订单号”,但如果仅“订单号”不能标识所有记录,则可以使用共享主键。
又比如,“产品名称”、“单价”等属性应该分成单独的表,这样它们只依赖于主键,而不依赖于其他非主键。

最后,还有第三种标准形式。
这个例子比较严格,要求非主键列不依赖于其他非主键列。
例如,如果有一个基于“订单号”的表“用户名”,而“订单号”则基于主键“用户ID”,这就违反了第三标准形式。
为了符合第三个标准表格,用户信息必须在单独的表中标识,因此更新用户信息不会影响订单表。

简而言之,这三种范式都是为了优化数据库结构,保证数据的完整性和一致性。
但在实际开发中,应根据具体情况灵活应用,不能严格应用。
无论如何,这取决于你。
我现在还在思考这个问题,我觉得很有趣。

sql数据库习题,规范化过程中的范式及模式分解问题

(1 ) R 不是 2 NF 模型的原因
说实话,R 不满足 2 NF 条件。
为什么?因为有部分依赖。
更具体地说,例如在关系R(A,B,C)中,假设B依赖于C,但A也依赖于C。
这称为部分依赖。
属性的非主属性仅依赖于主键的一部分,而不依赖于整个主键。
例如,主键是AB,但C仅依赖于A或B,而不依赖于整个AB。
就是这样。
2 NF 要求所有非主属性完全依赖于整个主键。
2 003 年的一本数据库教科书上就写到了这一点。
简单来说,这意味着主键的一部分无法确定非主属性,但必须一起确定整个主键。

(2 ) 将 R 分解为 2 NF 模式集
要将 R 分解为 2 NF 模式集,必须删除这些部分依赖关系。
如果看R(A,B,C),假设B部分依赖C,A部分依赖C,则可以分为R1 (AB)和R2 (BC)。
因此,在R1 中AB是绝对主键,在BC中B依赖于A,而C是独立的。
但是等等,事情还没有结束。
如果 B 仍然依赖于 A,例如,在 R(A, B, C) 中,B 依赖于 A,C 依赖于 B,那么它就变成了传递依赖。
例如,如果将 R(A, B, C) 分解为 R1 (AB) 和 R2 (BC),则结果表明 B 是 R2 中主键的一部分,但 C 仅依赖于 B,而不依赖于整个 AB。
这称为传递依赖。

所以又来了拆分,将R1 分为R1 (A)和R2 (AB),将R2 分为R2 (B)和R3 (C)。
你看,现在每个关系中的非主属性完全依赖于整个主键。
这一点在微软2 008 年的SQL Server文档中也提到过,即不能有传递依赖,否则必须分解。
最后,我们得到三个表R1 (A)、R2 (AB)和R3 (C),所以没问题。