读数据工程之道:设计和构建健壮的数据系统26数据建模

news2024/11/6 5:09:26

1. 数据建模

1.1. 良好的数据架构必须反映出使用这些数据的组织的业务目标和业务逻辑

1.2. 数据湖1.0、NoSQL和大数据系统的兴起,使工程师们有时是为了合理的性能提升去忽略传统的数据建模

1.3. 数据在企业中的地位急剧上升,人们越来越认识到,建模对于实现数据科学需求层次金字塔中更高层次的价值至关重要

2. 数据模型

2.1. 数据模型代表了数据与现实世界的联系方式

2.2. 反映了数据需要如何结构化和标准化才能最好地反映你的组织的流程、定义、工作流和逻辑

2.3. 一些数据专家认为数据建模是乏味的,是“大企业”才会做的事情

2.4. 对数据进行建模的关键是要关注如何将模型转化为业务成果

  • 2.4.1. 一个好的数据模型要关联到商业决策的影响

  • 2.4.2. 一个好的数据模型包含前后一致的定义

2.5. 数据建模的思想就是从抽象的建模概念移动到具体的实现

2.6. 主要的数据模型

  • 2.6.1. 概念模型

    • 2.6.1.1. 包含业务逻辑和规则,描述系统的数据,如模式、表和字段(名称和类型)​

    • 2.6.1.2. 使用实体关系(Entity-Relationship,ER)图中对其进行可视化通常是有帮助的,实体关系图是一个用于可视化数据中各种实体(订单、客户、产品等)之间的关系的标准工具

  • 2.6.2. 逻辑模型

    • 2.6.2.1. 通过添加更多的细节来详细说明概念模型在实践中如何实现
  • 2.6.3. 物理模型

    • 2.6.3.1. 定义了逻辑模型如何在数据库系统中实现

    • 2.6.3.2. 将为逻辑模型添加具体的数据库、模式和表,包括配置细节

2.7. 成功的数据建模在过程的开始阶段就引入业务利益相关者

  • 2.7.1. 数据建模应该是一项全接触式的活动,目标是为企业提供高质量的数据,最终获得可操作的洞见和智能自动化

2.8. 数据建模的另一个重要考虑因素是数据的粒度,也就是数据的存储和查询的最小单元

  • 2.8.1. 粒度通常位于表中的主键的层级(如客户ID、订单ID和产品ID)​,它通常伴随着一个日期或时间戳以提精确性

2.9. 应该努力将你的数据建模维持在尽可能低的粒度层级

  • 2.9.1. 很容易对这个高度细化的数据集做汇总

  • 2.9.2. 反之则不然,通常也不可能从汇总的数据还原回明细

3. 范式化

3.1. 范式化是一种对数据库中的表和列的关系进行严格控制的数据建模实践

3.2. 范式化的目标是消除数据库中的冗余数据,并确保参照完整性

3.3. 是在数据库中实践“不要重复自己”(Don't Repeat Yourself,DRY)的原则

3.4. 由关系数据库的先驱Edgar Codd在20世纪70年代初首次提出的

3.5. 四个主要目标

  • 3.5.1. 把关系集合从不合适的插入、更新和删除依赖中解放出来

  • 3.5.2. 当新的数据类型被引入时,尽可能减少关系集合的重组,从而增加应用程序的寿命

  • 3.5.3. 使得关系模型对用户来说更有信息价值

  • 3.5.4. 使得关系集合对于查询统计是中立的,这些统计可能会随着时间的推移而改变

3.6. 范式是有顺序的,每个范式都包含了之前范式的条件

  • 3.6.1. 无范式

    • 3.6.1.1. 没有范式化

    • 3.6.1.2. 允许嵌套和冗余的数据

  • 3.6.2. 第一范式(First Normal Form, 1NF)

    • 3.6.2.1. 每一列都是唯一的,有一个单一的值

    • 3.6.2.2. 该表有一个唯一主键

      3.6.2.2.1. 唯一主键是一个单一的字段或多个字段的组合,它唯一地确定了表中的行

      3.6.2.2.2. 每个键值最多出现一次,否则一个值会映射到表中的多条记录

  • 3.6.3. 第二范式(Second Normal Form, 2NF)

    • 3.6.3.1. 满足第一范式的要求,并移除部分依赖

      3.6.3.1.1. 部分依赖是指完全由唯一主键(复合键)中的一个子集决定的非键列

      3.6.3.1.2. 部分依赖只有在主键是复合键时才会出现

      3.6.3.1.3. 当复合键中的一个字段子集可以用来确定表中的一个非键列时,就会出现部分依赖

  • 3.6.4. 第三范式(Third Normal Form, 3NF)

    • 3.6.4.1. 满足第二范式的要求,再加上每个表只包含与其主键相关的字段,并且没有传递依赖

    • 3.6.4.2. 当一个非键字段依赖于另一个非键字段时,就会出现传递依赖

3.7. 尽管去范式化看起来像是一种反模式,但它在许多存储半结构化数据的OLAP系统中很常见

4. 建模技术

4.1. 星型模式

  • 4.1.1. 在数据集市中对数据进行建模的另一个流行方式是星型模式,理论上任何访问方便简单的数据模型也都是满足要求的

  • 4.1.2. 代表了企业的数据模型

  • 4.1.3. 与高度范式化的数据建模方法不同,星型模式是被必要维度包围的事实表

    • 4.1.3.1. 使得星型模式需要比其他数据模型更少的连接操作,从而加快了查询性能
  • 4.1.4. 星型模式的另一个优点是它可以更容易被业务用户理解和使用

4.2. Inmon

  • 4.2.1. 数据仓库之父Bill Inmon在1989年提出了他的数据建模方法

  • 4.2.2. 在数据仓库之前,分析往往直接发生在源系统内部,其明显的副作用是长时查询造成了生产环境事务数据库的性能问题

  • 4.2.3. 数据仓库的目标是将源系统与分析系统分离

  • 4.2.4. 数据仓库的四个关键部分

    • 4.2.4.1. 面向主题的

      4.2.4.1.1. 数据仓库专注于一个特定的主题域

    • 4.2.4.2. 集成的

      4.2.4.2.1. 来自不同数据源的数据会被整合并范式化

    • 4.2.4.3. 非易失的

      4.2.4.3.1. 数据存储在数据仓库后保持不变

    • 4.2.4.4. 反映历史变化的

      4.2.4.4.1. 不同的时间范围的数据都可以被查询到

  • 4.2.5. 在Inmon数据仓库,整个组织的数据都被整合到一个细粒度、高度范式化的并且注重ETL的实体关系模型中

  • 4.2.6. 数据从优先级最高的业务领域开始被逐步引入

4.3. Kimball模型

  • 4.3.1. 由Ralph Kimball在20世纪90年代初创建,这种数据建模方法不太注重范式化,在某些情况下还接受去范式化

  • 4.3.2. Kimball方法有效地使数据集市成为数据仓库本身

    • 4.3.2.1. 这也会使迭代和建模的速度比Inmon更快,但代价是潜在的更松散的数据集成、数据冗余和重复
  • 4.3.3. 数据被建模为两种类型的表:事实和维度

    • 4.3.3.1. 事实表

      4.3.3.1.1. 可以把事实表看作一个数字表

      4.3.3.1.2. 星型模式中的第一种表是事实表,它包含了事实的、定量的和与事件相关的数据

      4.3.3.1.3. 事实表中的数据是不可改变的,因为事实与事件有关

      4.3.3.1.3.1. 事实表只能做追加而不会被更新

      4.3.3.1.4. 事实表通常又窄又长,意味着它们没有很多列,但有很多代表事件的行

      4.3.3.1.5. 事实表应该是尽可能细粒度的

    • 4.3.3.2. 维度表B

      4.3.3.2.1. 维度表则是引用事实的定性数据

      4.3.3.2.2. 维度表以一种叫作星型模式的关系围绕着一个事实表

      4.3.3.2.3. 维度表为存储在事实表中的事件提供参考数据、属性和关系上下文

      4.3.3.2.4. 维度表比事实表小(形状相反)​,通常是宽而短

      4.3.3.2.5. 缓慢变化维度表(Slowly Changing Dimension,SCD)

      4.3.3.2.5.1. 第一类

4.3.3.2.5.1.1. 覆盖现有的维度记录

4.3.3.2.5.1.2. 很简单的但是这意味着你无法访问被删除的历史维度记录

4.3.3.2.5.1.3. 是大多数数据仓库的默认行为

  >   4.3.3.2.5.2. 第二类

4.3.3.2.5.2.1. 保留完整的历史维度记录

4.3.3.2.5.2.2. 是我们在实践中最常看到的一种

  >   4.3.3.2.5.3. 第三类

4.3.3.2.5.3.1. 第三类缓慢变化维度与第二类相似,但是在第三类中不是创建一个新行,而是创建一个新的字段

  • 4.3.4. Kimball方法允许冗余数据的存在,但是要避免复制相同的维度表,以避免业务定义和数据完整性的漂移

  • 4.3.5. 只适合于批处理数据而不适合于流处理数据

4.4. Data Vault模型

  • 4.4.1. Kimball和Inmon专注于数据仓库中的业务逻辑结构,而Data Vault则提供了一种不同的数据建模方法

  • 4.4.2. 由Dan Linstedt在20世纪90年代创建的Data Vault方法将源系统数据的结构与属性分离

  • 4.4.3. Data Vault不是用事实、维度或高度范式化的表来表示业务逻辑,而是简单地将数据从源系统直接加载到少数几个特制的表中,只需插入即可

  • 4.4.4. 目标是使数据尽可能地与业务保持一致,甚至在业务数据的演进过程中

  • 4.4.5. 三种主要类型的表组成:中心表、链接表和卫星表

    • 4.4.5.1. 中心表存储业务主键

      4.4.5.1.1. 查询通常涉及通过业务主键进行搜索

    • 4.4.5.2. 链接表维护业务主键之间的关系

      4.4.5.2.1. 跟踪中心表之间的业务主键的关系

      4.4.5.2.2. 最好以最细的粒度来连接中心表

    • 4.4.5.3. 卫星表表示业务主键的属性和上下文

      4.4.5.3.1. 卫星表中唯一需要的字段是一个由父级中心表的业务键组成的主键和一个加载日期

      4.4.5.3.2. 一个卫星表可以包含多个有意义的属性

  • 4.4.6. 用户将查询中心表,它将链接到一个包含查询的相关属性的卫星表

4.5. 去范式化的宽表

  • 4.5.1. 云计算的普及意味着存储是非常便宜的

    • 4.5.1.1. 存储数据的成本已经低到不值得花时间去寻找最省空间的方式
  • 4.5.2. 嵌套数据(JSON和类似的)的流行意味着模式在源和分析系统中是灵活的

  • 4.5.3. 宽表就像它听起来那样,是一个常在列式数据库中创建的、高度去范式化的、包含许多字段的集合

    • 4.5.3.1. 一个宽表有可能有成千上万个列,而关系数据库中的表通常少于100列

    • 4.5.3.2. 宽表一般是通过模式演化产生的,工程师随着时间的推移逐渐增加字段

  • 4.5.4. 对宽表的分析查询往往比对需要许多连接的高度范式化的数据运行得快

  • 4.5.5. 宽表包含了你在一个更严格的建模方法中加入的所有数据,且事实和维度在同一张表

5. 流数据的建模

5.1. 由于流数据的无界性和连续性,将Kimball这样的批处理技术转化为流范式是很困难的,甚至是不可能的

5.2. 存在两种主要类型的流:事件流和变更数据捕获

5.3. 建议预测源数据的变化,并保持一个灵活的模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2230955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2025生物发酵展(济南)为生物制造产业注入新活力共谱行业新篇章

2025第十四届国际生物发酵展将于3月3-5日济南盛大举办!产业链逐步完整,展会面积再创历史新高,展览面积较上届增涨至60000平方米,专业观众40000,品牌展商800,同期活动会议增加至50场,展会同期将举…

Windows版 nginx安装,启动,目录解析,常用命令

Windows版 nginx安装,启动,目录解析,常用命令 一级目录二级目录三级目录 1. 下载2. 启动方式一:方式二: 3. 验证是否启动4. 安装目录解析5. 常用命令 一级目录 二级目录 三级目录 1. 下载 官网下载:ngi…

【maven】idea执行了maven的install命令给本地安装项目依赖包 安装后删除

目录 事件起因环境和工具操作过程解决办法1、找到对应的目录下的文件,手动去删除,比如我的依赖库的路径是D:\qc_code\apache-maven-3.8.2\repository 我只需要找到这个目录下对应的依赖包进行手动删除即可(不推荐,强行删除文件夹文…

技术选型不当对项目的影响与补救措施

在项目管理中,初期技术选型与项目需求不匹配的情况并不罕见,这可能导致项目延误、成本增加和最终成果的不理想。补救的关键措施包括:重新评估技术选型、加强团队沟通、实施有效的需求管理以及建立持续的反馈机制。其中,重新评估技…

基于SSM+VUE宠物医院后台管理系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

MySQL 8.0在windows环境安装及配置

文章目录 一、下载二、安装三、配置环境变量 一、下载 1、先彻底卸载之前的MySQL,并清理其 残留文件 。 2、登录网址https://www.mysql.com/ 3、点击网址左下角“中文”按钮,切换到中文界面 4、点击网页上方的“下载”按钮,然后点击网页…

【传知代码】用于图像识别的判别图正则化技术

🍑个人主页:Jupiter. 🚀 所属专栏:传知代码 欢迎大家点赞收藏评论😊 目录 论文概述图正则化技术及其优点参考文献: 算法流程在标准BLS中嵌入判别图正则化的方法 模型整体架构代码复现图拉普拉斯矩阵的构建—…

第二十五章 Vue父子通信之sync修饰符

目录 一、概述 二、完整代码 2.1. main.js 2.2. App.vue 2.3. BaseDialog.vue 三、运行效果 一、概述 前面的章节我们讲到,通过v-model我们可以实现父子组件间的通信,但是使用v-model的时候,子组件接收的prop属性名必须固定为valu…

头歌——机器学习(逻辑回归)

文章目录 逻辑回归简述代码 sklearn逻辑回归 - 手写数字识别代码 逻辑回归算法详解似然与概率的区别逻辑回归算法的代码实现代码 逻辑回归案例 - 癌细胞精准识别代码 逻辑回归简述 什么是逻辑回归 当一看到“回归”这两个字,可能会认为逻辑回归是一种解决回归问题的…

【高等数学】3-2多元函数积分学

1. 二重积分 可以想象你有一块不规则的平面薄板,它在一个平面区域上。二重积分就是用来求这个薄板的质量(假设薄板的面密度函数是)。 把区域划分成许多非常小的小方块(类似于把一块地划分成很多小格子),在每个小方块上,密度近似看成是一个常数,然后把每个小方块的质量加…

需求管理流程与工具:国内外10款综合评测

本文中,分享了10款需求管理工具:1.PingCode;2.Worktile;3.纷享销客;4.Teambition;5.Jira;6.Trello;7.Figma;8.万维需求管理;9.ClickUp;10.项目管理…

Java项目实战II基于Spring Boot的个人云盘管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 基于Spring Boot的个人云盘管理系统设计…

嵌入式之C语言(基础篇)

首先,我们要知道什么是程序。程序:为了让计算机执行某操作或解决某个问题而编写的一系列有序指令的集合。 一、计算机语言简史 第一代是机器语言:时间实在1946年,第一台计算机ENIAC诞生,用的是穿孔卡片做的&#xff0c…

搜索引擎算法更新对网站优化的影响与应对策略

内容概要 随着互联网的不断发展,搜索引擎算法也在不断地进行更新和优化。了解这些算法更新的背景与意义,对于网站管理者和优化人员而言,具有重要的指导意义。不仅因为算法更新可能影响到网站的排名,还因为这些变化也可能为网站带…

牛客周赛65(C++实现)

比赛链接:牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 文章目录 1.超市1.1 题目描述1.2 思路1.3 代码 2. 雨幕2.1 题目描述2.2 思路2.3 代码 3.闺蜜3.1 题目描述3.2 思路3.3 代码 4. 医生4.1 题目描述4.2 思路4.3 代码 1.超市 1.1 题目描述 …

【解决方案】微信小程序如何使用 ProtoBuf 进行 WebSocket 通信

前言 故事背景 简单说下背景,项目中需要用 ProtoBuf 协议转换请求参数,并通过 WebSocket 进行双向通信。重点!一个是 web端(Vue3 TS),一个是微信小程序端(原生 JS)。 剧情发展 …

练习LabVIEW第三十四题

学习目标: 刚学了LabVIEW,在网上找了些题,练习一下LabVIEW,有不对不好不足的地方欢迎指正! 第三十四题: 在一个波形表中显示三条随机数组成的曲线,分别用红,绿,蓝三种…

rnn/lstm

tip:本人比较小白,看到july大佬的文章受益匪浅,现在其文章基础上加上自己的归纳、理解,以及gpt的答疑,如果有侵权会删。 july大佬文章来源:如何从RNN起步,一步一步通俗理解LSTM_rnn lstm-CSDN博…

Python | Leetcode Python题解之第528题按权重随机选择

题目: 题解: class Solution:def __init__(self, w: List[int]):self.pre list(accumulate(w))self.total sum(w)def pickIndex(self) -> int:x random.randint(1, self.total)return bisect_left(self.pre, x)

使用Python多线程抓取某图网数据并下载图片

前言 在互联网开发领域,数据抓取是一项非常实用的技术。通过数据抓取,我们可以从网页上获取所需的信息,并将其转化为结构化数据,以便进一步分析或使用。本文将介绍如何利用Python编写一个多线程程序来抓取网页上的图片数据&#…