元组:表中的一行
码:表中的一列
候选码:可唯一标识,如通过(身份证号码)或者 (学校,班级,学号)可唯一标识一个人;主属性:候选码中出现过的属性
主码 : 也叫主键,从候选码中选出一个老大
外码也叫外键。如果一个关系中的一个属性
是另外一个关系中的主码
则这个属性为外码
第一范式,第二范式,第三范式的超简单介绍
第一范式: 不可再分
如一个表中有两个属性:
公司、商品(名称、数量)
,但商品可由名称、数量表示,不符合,而公司、名称、数量
符合
第二范式:建立在第一范式基础上,消除部分依赖
订单号 | 产品号 | 产品数量 | 产品折扣 | 产品价格 | 订单金额 | 订单时间 |
---|---|---|---|---|---|---|
10001 | 25 | 100 | 0.9 | 9 | 5000 | 2022-07-22 |
10001 | 26 | 200 | 0.8 | 9 | 7000 | 2022-07-23 |
订 单 号 、 产 品 号 → 产 品 数 量 、 产 品 折 扣 、 产 品 价 格 订 单 号 → 订 单 金 额 、 订 单 时 间 订单号、产品号\to产品数量、产品折扣、产品价格 \\ 订单号\to 订单金额、订单时间 订单号、产品号→产品数量、产品折扣、产品价格订单号→订单金额、订单时间
‘订单号’ 和 ‘产品号’ 是表的主键(主码),这两个字段一起决定了 ‘产品数量‘ ’产品折扣‘ ’产品价格‘ ,
而‘订单金额’和‘订单时间’仅由‘订单号’决定,不是由 主键(‘订单号’ 和 ‘产品号’)共同决定,所以‘订单金额’和‘订单时间’是部分依赖于主键
正确版本 👇
订单号 | 产品号 | 产品数量 | 产品折扣 | 产品价格 |
---|---|---|---|---|
10001 | 25 | 100 | 0.9 | 9 |
10001 | 26 | 200 | 0.8 | 9 |
订单号 | 订单金额 | 订单时间 |
---|---|---|
10001 | 5000 | 2022-07-22 |
10001 | 7000 | 2022-07-23 |
第三范式:建立在第二范式基础上,消除传递依赖
身份证号 | 姓名 | 性别 | 年龄 |
---|---|---|---|
34666666666 | 张三 | 男 | 22 |
身 份 证 → 姓 名 → 性 别 、 年 龄 身份证 \to 姓名 \to 性别、年龄 身份证→姓名→性别、年龄
“性别”和“年龄”虽然间接依赖‘身份证号’,但直接依赖的是“姓名”,正确版本 👇
身份证号 | 姓名 |
---|---|
34666666666 | 张三 |
姓名 | 性别 | 年龄 |
---|---|---|
张三 | 男 | 22 |
传递函数依赖: 身 份 证 → 姓 名 → 性 别 、 年 龄 但 是 性 别 、 年 龄 ↛ 姓 名 ↛ 身 份 证 身份证 \to 姓名 \to 性别、年龄 ~~~~~~但是~~~~~~ 性别、年龄 \not\to 姓名 \not\to 身份证 身份证→姓名→性别、年龄 但是 性别、年龄→姓名→身份证