数据库的三大范式讲解(大白话+图文 小白看了都能懂)

数据库的三大范式讲解

在讲解数据库的三大范式之前,我们需要了解一些基本概念,我们可以通过一张表来对这些概念进行更好的理解

在这里插入图片描述

  1. 函数依赖: A–>B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A。
    例如:(A)学号–>(B)姓名。
    (A)(学号,课程名称) -->(B) 课程分数

  2. 完全函数依赖: A–>B,如果A是一个属性组,则B属性值进行确定时,要依赖于A属性组中所有的属性值,缺一不可。
    例如:(A)(学号, 课程名称) --> (B)课程分数
    //必须通过学号和课程名称才能确定课程分数

  3. 部分函数依赖: A–>B,如果A是一个属性组,则B属性值进行确定只需要依赖于A属性组中某一些值即可。
    例如: (学号, 课程名称)–>(B)姓名
    //只需要学号便可确定该生的姓名,并不需要A属性组中的课程名称来确定姓名。

  4. 传递函数依赖: A–>B, B–>C .如果通过A属性(属性组)的值,可以确定唯一B属性的值,再通过B属性(属性组)的值可以确定唯一C属性的值,则称C传递函数依赖于A。
    例如:(A)学号–>(B)系名,(B)系名–>©系主任
    //通过学号可以找到系名,通过系名可以确定系主任

  5. 码:如果在一张表中,一个属性或者属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
    例如:该表中码是一个属性组,该属性组为: (学号, 课程名称),
    *主属性:码属性组中的所有属性
    *非主属性:除过码属性组的属性组.

引出问题:

  1. 存在非常严重的数据冗余(重复): 例如:(姓名、系名、系主任)这一个属性组重复了很多次
  2. 数据添加存在问题:
    例如:添加新开设的系和系主任时,因为没有招入学生,所以会导致数据不合法而无法添加新开设的系和系主任。
  3. 数据删除存在问题:
    例如:张无忌同学毕业了,需要删除其所有数据,但会将经济系和该系的系主任的数据一起删除,并不符合逻辑,学生一走,难道就让整个系消失吗,显然相当不合理。

那么既然存在这么多的问题,那就说明我们这个数据库的学生表就创建的很有问题,那么我们该如何解决这些问题呢?这就需要请出我们的数据库三大范式来解决了

第一范式(1NF):

概念:

在一张表中,每一列都是不可分割的原子数据项。

实际操作:在这里插入图片描述

这一列就不符合第一范式的要求,系中竟然包含了两列——系名和系主任,我们只需要将其直接划分为两列即可,因为数据库的创建要求下也无法写成上述的样子,所以第一范式较好理解。

在这里插入图片描述此表符合了数据库的第一范式

第二范式(2NF):

概念:

在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非码属性对主码的部分函数依赖)

欲解决的问题:

存在非常严重的数据冗余(重复):
例如:(姓名、系名、系主任)这一个属性组重复了很多次。

实际操作:在这里插入图片描述

将原来的表拆分成两个表,一个选课表,一个学生表。

选课表:

  • 码:属性组(学号,课程名称)
  • 非码:分数

非码属性(分数)必须由主码属性组(学号,课程名称)确定,缺一不可。

学生表:
码:学号
非码:姓名 、系名、系主任
非码属性(姓名 、系名、系主任)都可由主码属性(学号)确定。

解决的问题:

消除了 类似(A)(学号, 课程名称)–>(B)姓名 这种B对A的部分函数依赖
同时也消除了(姓名、系名、系主任)这一个属性组重复了很多次的问题。

未解决的问题:

  • 数据添加存在问题: 例如:添加新开设的系和系主任时,因为没有招入学生,所以会导致数据不合法而无法添加新开设的系和系主任。
  • 数据删除存在问题:
    例如:张无忌同学毕业了,需要删除其所有数据,但会将经济系和该系的系主任的数据-起删除,并不符合逻辑,学生一走,难道就让整个系消失吗,显然相当不合理。

第三范式(3NF):

概念:

在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF 基础上消除传递依赖)

欲解决的问题:
  • 数据添加存在问题: 例如:添加新开设的系和系主任时,因为没有招入学生,所以会导致数据不合法而无法添加新开设的系和系主任。
  • 数据删除存在问题:
    例如:张无忌同学毕业了,需要删除其所有数据,但会将经济系和该系的系主任的数据一起删除,并不符合逻辑,学生一走,难道就让整个系消失吗,显然相当不合理。
实际操作:在这里插入图片描述

将学生表再细分为学生表和系表:
消除了之前可以通过学号找到系名,再从系名找到系主任存在的系主任对于学号的传递函数依赖关系

解决的问题:
  • 数据添加存在问题: 例如:添加新开设的系和系主任时,可以在系表上直接添加,这一操作变得合法。
  • 数据删除存在问题:
    例如:张无忌同学毕业了,需要删除其所有数据,但却不会将经济系和该系的系主任的数据一起删除,该系和系主任依旧存在于系表中。

至此:

我们已经将原表中存在的问题通过数据库的三大范式一一解决了,我们也从实际操作中更好的对三大范式进行了一定的理解,数据库的三大范式是规范数据库中的表创建的准则,我们需要对其进行充分的理解后才能创建出更合理的数据库,已达到方便我们对数据的操作。

扩展:

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般来说,数据库只需满足第三范式(3NF)就行了。
大家如果对后面的三个范式感兴趣的话。可以自行查阅资料,以完善我们对数据库的知识体系。

<think>好的,我需要为用户提供一个关于岭回归的简单易的解释或教程。首先,我应该回顾岭回归的基本概念,确保自己理解正确。根据引用[1]和[2],岭回归是对普通线性回归的改进,通过引入L2正则化项来解决多重共线性和过拟合的问题。用户可能不太熟悉这些术语,所以我需要用简单的语言解释。 接下来,我需要比较普通线性回归和岭回归的区别。引用[1]提到普通线性回归使用最小二乘法,而岭回归加入了惩罚系数,导致损失部分无偏性但提高了稳定性。这部分需要解释为什么无偏性被牺牲,以及正则化如何起作用。 然后,数学公式是必要的,但用户要求简单易,所以不能太复杂。引用[2]中的目标函数应该用LaTeX格式展示,比如$J(\theta) = \text{MSE} + \alpha \|\theta\|_2^2$,并解释每个部分的含义。同时,引用[1]提到的范数部分,五·范数可能是个笔误,应该是L2范数,需要确认并正确表述。 用户可能想知道岭回归的应用场景和优势。引用[3]提到岭回归提高泛化能力,适用于特征多过样本或存在共线性的情况。这部分需要举例说明,比如在数据维度高时的处理效果。 另外,代码示例可能有帮助。引用[4]中的Python代码片段展示了数据分割,但需要展示如何实际应用岭回归,比如使用sklearn的Ridge类。确保代码简洁,并解释关键参数如alpha的作用。 最后,生成相关问题需要考虑用户可能的后续疑问,比如如何选择alpha值,与Lasso回归的区别,评估模型的方法等。这些问题需要自然衔接,帮助用户深入学习。 在组织内容时,要保持结构清晰,分点讲解,避免技术术语过多,必要时用比喻或类比。同时,确保所有数学公式符合格式要求,行内公式用$...$,独立公式用$$...$$,并正确引用参考资料。检查LaTeX语法是否正确,避免错误。 总结步骤: 1. 定义岭回归及其目的 2. 对比普通线性回归的问题 3. 解释正则化的作用和L2惩罚项 4. 展示目标函数公式 5. 说明参数alpha的作用 6. 提供Python代码示例 7. 应用场景和优势 8. 注意事项 9. 相关问题 需要确保每个部分简洁明了,符合用户对入门教程的需求。</think>### 岭回归简单讲解 #### 一、基本定义 岭回归(Ridge Regression)是**改良版的线性回归**,核心是**通过添加正则化项解决普通线性回归的缺陷**。当数据存在多重共线性(特征高度相关)或特征数多于样本数时,普通线性回归可能失效,而岭回归能稳定求解[^1][^2]。 #### 二、与普通线性回归的对比 1. **普通线性回归** 目标是最小化误差平方和: $$J(\theta) = \sum_{i=1}^m (y_i - \theta^T x_i)^2$$ 但若特征矩阵$X^TX$不可逆(如特征共线性或样本不足),无法求解析解[^1]。 2. **岭回归改进** 添加L2正则化项(惩罚系数$\alpha$控制强度): $$J(\theta) = \sum_{i=1}^m (y_i - \theta^T x_i)^2 + \alpha \sum_{j=1}^n \theta_j^2$$ 这一改动使$X^TX + \alpha I$始终可逆,确保解唯一[^2]。 #### 三、核心作用 - **解决多重共线性**:正则化压缩系数,减少相关性干扰 - **防止过拟合**:惩罚大系数,限制模型复杂度 - **处理高维数据**:特征数多于样本数时仍可用[^3] #### 四、参数说明 - **$\alpha$(正则化强度)** - $\alpha=0$时退化为普通线性回归 - $\alpha$越大,系数压缩越明显(但可能欠拟合) #### 五、Python代码示例 ```python from sklearn.linear_model import Ridge from sklearn.model_selection import train_test_split # 分割数据(引用示例代码[^4]) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) # 训练模型(alpha=1.0为默认值) ridge = Ridge(alpha=1.0) ridge.fit(X_train, y_train) # 预测与评估 score = ridge.score(X_test, y_test) ``` #### 六、应用场景 1. 医疗数据分析(基因表达等高维数据) 2. 金融风控(消除共线性特征影响) 3. 图像处理(像素特征相关性高) #### 七、注意事项 - 需标准化数据(正则化对尺度敏感) - 通过交叉验证选择最佳$\alpha$值 - 若需要特征选择,可结合Lasso回归(L1正则化) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值