当前位置: 首页 > news >正文

从0开始数据仓库--数据表范式

定义:
数据库范式是一种用于减少冗余,提高数据一致性和可维护性的规则

一、核心概念

  • 函数依赖:X 确定 Y,记作 X→Y
  • 候选码:能唯一标识一行的最小属性集
  • 主属性:出现在候选码中的属性
  • 非主属性:不出现在任何候选码中的属性
  • R(): 「单个关系模式 R」

在关系模式r中范式可以分为5类

1NF:所以列不可以在分,即属性必须原子,不能再分。

以下是一个不满足第一范式的案例:

user表:

IDNAMETEL
1张三12234567890,12334567890
2李四12344567890

上表可见TEL手机号中存在多个值信息,没有做到列不可再分
正确结构为:

user表:

IDNAMETEL
1张三12234567890
2李四12344567890
3张三12334567890

2NF:必须完全依赖不能部分依赖,即其他表关联user表中要完全依赖主键

非联合主键都满足第二范式
user表:

IDUSER_IDNAMETELPHONE_BILLSEXSEX_NANE
1001张三12234567890128X
2002李四1234456789013Y
3001张三1233456789065X
4003王五12234567890/Y

(USER_ID + TEL) 确定唯一一条数据,其他字段关联user表时要用 (USER_ID + TEL) 关联

ID非业务主键(只做展示不做使用)
F(
SEX → SEX_NAME,
(USER_ID,TEL)→ NAME、SEX
)
存在部分依赖 USER_ID -> SEX

正确格式:

user

USER_IDNAMESEX
001张三X
002李四Y
003王五Y

user_contact

USER_IDTELPHONE_BILL
00112234567890128
0021234456789013
0011233456789065
00312234567890/

sex_dict

SEXSEX_NAME
X
Y
  • user:候选码是 USER_ID(单属性),天然无部分依赖;
  • user_contact:候选码是 (USER_ID, TEL),非主属性 PHONE_BILL 依赖完整候选码,无部分依赖;
  • sex_dict:候选码是 SEX(单属性),天然无部分依赖。

3NF:必须直接依赖,不能有传递依赖:即字段

IDNAMETELDEPTDEPT_NAME
1张三1223456789001销售部
2李四1234456789002开发部

F(
NAME -> DEPT ,
DEPT -> DEPTNAME
)
存在传递依赖 _NAME -> DEPT ->DEPT_NAME

BCNF:所有函数依赖的左边,必须是候选码。

IDNAMEAGEGENDER
1张三24X
2李四34Y

F(
NAME -> AGE ,
NAME -> GENDER
)
所有列都依赖最左边的NAME

4NF:消除多值依赖:即一对多里,不要把两个互不相关的 “多” 塞在同一张表里。

IDNAMEAGESEXEYE_SIGHT
1张三24XL:5.0
2张三24XR:4.7
3李四34YL:4.8
4李四34YR:4.6

上表可以看到人员信息存在左眼和右眼视力一对多的情况,如果用户只想要获取年龄会还须二次处理

正确处理方法为:

IDNAMEAGESEXL_EYE_SIGHTR_EYE_SIGHT
1张三24XL:5.0R:4.7
2李四34YL:4.8R:4.6

或者单独创建一张维度表

5NF: 消除连接依赖:拆到不能再拆

一张表如果能无损拆成三张及以上更小的表,就拆干净,不要再合并回去(项目上不要使用)。

范式优点
当我们遵守范式规则如果要更改那个表的维度值编码信息,可以直接变更拆封的表内的码值信息

范式缺点
范式并不是越多越好在OLAP数据仓库中我们要进行反范式化使其性能提高,查询代码更加简洁(表结构拆的越细,编写业务指标时关联表的次数就会越多,代码维护起来就更加费力)

范式习题:

  1. R (学号,姓名,班级,班级名,性别,年龄)

F(
学号 -> 年龄,
学号 -> 性别,
学号 -> 班级,
班级 -> 班级名
)
上述结构满足第几范式,候选码是什么

  1. 现有关系模式:R(A,B,C,D,E,F),
    其中AB为候选码,存在函数依赖B→C,A→D,D→E,D→F
    R(X,Y,Z),F = { Y→Z,XZ→Y}
    写出满足BCNF格式的关系模式

  2. 现有一个json数据,请你针对该数据设计一张数据表:(各项目都有2次考核机会,如第一次不合格会有第二次成绩)
    姓名,年龄,身高,体重,性别,民族, 班级, 导员,肺活量,跳远成绩,50m, 1000m, 是否合格

http://www.jsqmd.com/news/486990/

相关文章:

  • 聚焦民生就医需求 陪诊行业规范提质 北京守嘉陪诊引领行业高质量发展 - 品牌排行榜单
  • 游戏相关AI技术
  • Ozon卖家醒醒吧!别再“手动搬砖”了,你的对手已经在用AI“开挂”了
  • 跨境电商选品师口碑如何?网上教你做电商的可信吗?
  • 世界读书日|与AI共舞,在阅读中寻找你的不可替代性
  • 人工智能之数字生命--“骨架真相”
  • 产品经理工作坊
  • CopyOnWriteArrayList源码学习
  • 拓宽视野:AI领域的非技术岗位全景图(产品、运营、销售等)
  • MySQL 中 MVCC 和锁的关系与配合
  • TR-069 交互流程开发规范
  • 基于SpringBoot与Android的宠物社区APP设计与实现
  • 2007-2024年上市公司多言寡行数据
  • ADS原理图VIAGND直接生成版图未成功过孔
  • 【第二周】RAG与Agent实战15:模板类的 format 和 invoke 方法深度解析
  • 矩形面积交-进阶题7
  • vue3-signature实现电子签名
  • 【GUI-Agent】阶跃星辰 GUI-MCP 解读---(1)---论文
  • Agentic AI时代程序员必备算法思想详解(附实战案例)
  • MySQL数据库—索引
  • AstrBot+NapCat 打造随时随地可用的 QQ 智能机器人(1)
  • MCP工具粒度的权衡 - yi
  • 解决大模型微调的灾难性遗忘:Nova Forge 数据混合策略工程实践
  • Claude Code 费用与中转api
  • C语言指针概念详解:数组指针与二级指针的本质区别
  • 2026年高端制造视角下的气密性测试仪供应商甄选与竞争力解析 - 深度智识库
  • P8627 [蓝桥杯 2015 省 A] 饮料换购【模拟+数学】
  • 第一个Java文件!Hello,world! - Kight
  • 银河麒麟桌面操作系统 V11 来袭!硬核架构 + 全维安全
  • kubernetes知识点汇总13-18