数据建模——核心概念

数据建模——核心概念

数据建模指的是对现实世界各类数据的抽象组织,确定数据库需管辖的范围、数据的组织形式等直至转化成现实的数据库。数据建模的主要目标是以最有效的方式存储和检索数据。

在本文中,我将介绍联机事务处理OLTP(on-line transaction processing)和联机分析处理OLAP(On-Line Analytical Processing)应用的数据库设计和数据建模的基本概念。如果你想了解更多关于数据科学的相关内容,可以阅读以下这些文章:
如何明确和解决模糊的数据科学问题?
构建数据科学管道的 4 个步骤
2022年,我们给数据科学初学者推荐这5本书
Kaggle 还是 Github?哪个对数据科学家更有用?

ACID和BASE

数据库设计中最基本的原则是ACID。任何数据库都要遵循这个原则。

ACID的特性:

  • 原子性——事务的所有部分都成功,或者全部失败并回滚。
  • 一致性——所有提交的数据必须与所有数据规则一致,包括约束、触发器、级联、原子性、隔离性和持久性。
  • 隔离性——任何事务都不能干扰其他并发事务。
  • 持久性——一旦提交事务,数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。

BASE的特性:

  • 基本可用——即使系统出现故障,每个请求都将返回响应。
  • 软状态——系统的状态始终是软的,这意味着它可以随着时间的推移而改变,即使没有读或写操作,因为系统会不断更改数据以使其一致。
  • 最终一致性——数据可能不会立即一致,但最终会变得一致。

ACID模型提供了一个一致的系统。基本模型提供了高可用性。

数据建模

数据建模是创建企业数据元素及其之间连接的可视化表示的过程。以下是按相同顺序构建的不同类型的数据建模。

  • 概念数据建模(CDM)
  • 逻辑数据建模(LDM)
  • 物理数据建模(PDM)

概念数据建模(CDM)数据建模过程中的第一步是在模型中提出域的范围和语义。CDM中定义了高级别组件和关系。

概念数据建模

逻辑数据建模(LDM)逻辑数据建模基于概念模型,定义数据元素和表间的关系。使用键定义属性并创建关系。

逻辑数据建模

物理数据建模(PDM):物理数据建模是基于CDM创建的。PDM中定义了数据类型、字段长度和命名标准等技术细节。PDM将是用于在数据库中创建对象的工件。ErWin等DM工具利用PDM生成DDL并创建表。

物理数据建模

数据建模技术

  • 1. 关系数据建模
  • 2. 多维数据建模

关系数据建模(ER):关系数据建模是事务系统(OLTP)中使用的技术。事务处理数据建模在处理实时CRUD操作时必须具有读写效率。销售点(POS)系统是关系建模用例的经典例子。

关系建模的基本构建块是实体和关系。

  • 实体——数据集的逻辑分组(即表)
  • 关系——定义实体之间的关系。(即主外键关系)。实体可以有一对一、一对多或多对多的关系。

以下是设计ER模型所需的核心概念。

数据规范化

规范化是结构化构建数据库时,减少数据冗余和提高数据完整性的过程。为了在数据库中执行CRUD操作而不导致任何异常,需要进行规范化。

规范化的目的:

  • 消除冗余(无用)数据。
  • 确保数据相关性合理,即数据以逻辑方式存储。
  • 避免异常现象

让我们用下表来解释数据库异常:

  • 插入异常——在关系数据库中,当某些属性或数据项要插入数据库,但某一属性还没有取值时,会发生异常。例如:假设有一名新生入学,我们有一个学生id,一个学生的姓名和城市,但是如果学生还没有选择任何科目,那么我们必须在那里插入NULL,导致插入异常。
  • 更新异常——当重复数据仅在一个位置更新而不是在所有实例中更新时发生。例如:要更新表中出现两次或两次以上的学生的城市,我们必须更新所有行中的城市列,否则数据将变得不一致。
  • 删除异常——由于删除其他记录而导致数据库表中的某些记录丢失或删除时,数据库表中会出现异常。例如,如果id为101的学生只有一个科目,并且他暂时放弃了该科目,当我们删除该行时,整个学生记录将被删除,并导致删除异常。

范式

第一范式(1NF)——表的所有属性只包含原子值。即每列包含一个值。

  • 列值应该是原子的、标量的,或者应该包含单个值。
  • 在多列中不重复信息或值。

第二范式(2NF)——1NF+所有非码属性在功能上都应该完全依赖于主键。

第三范式(3NF)——2NF+它不应该包含任何传递依赖项。传递依赖是指任何非码属性决定或依赖于另一个非码属性。

BCNF——一个关系模式R被认为是Boyce–Codd范式(BCNF),如果它的每一个依赖项都是X→Y、 下列条件之一成立:

  • X→Y是一个平凡的函数依赖项(即Y是X的子集)
  • X是模式R的超级键superkey。

维度数据建模

维度数据建模技术用于为支持业务分析和报告用例的OLAP应用程序设计数据仓库。

在开始任何数据建模工作之前,第一步也是最重要的一步是了解业务并列出需要跟踪和测量的指标。以下是一些指标类型

  • 成功指标——跟踪业务的成功标准。例如,转化率、每日活跃用户。
  • 护栏指标——跟踪与产品/功能性能相关的指标。例如,取消率、退订率。

一旦确定了业务指标,就会使用下面的设计流程进行数据建模。

四步立体设计过程

  • 1. 选择业务流程——业务的事务性活动。例如:订单、处理保险索赔、为学生注册课程。
  • 2. 声明粒度——业务捕获数据的级别,原子颗粒被鼓励用于有效的分析。
  • 3. 确定业务事件的维度——业务事件的描述性上下文。“谁、什么、在哪里、何时、为什么和如何”都在维度中被捕获。
  • 4. 确定事实——来自业务流程的度量,它总是数字。

星型模式:是为在数据仓库中使用而优化的数据库组织结构,它是最简单的。顾名思义,星型模式包含一个由维度表包围的事实表。每个维度都有一个主键,在事实表中被引用为FK。星型模式中的维度是非规范化的,以便在OLAP应用程序中更快地连接。

星型模式

优点:

  • 联接中的数字表越少,查询速度就越快。
  • 简化的业务报告。
  • 更快的OLAP多维数据集生成。

缺点:

  • 许多人际关系无法有效处理。
  • 在非规范化架构状态下不强制执行数据完整性。

雪花模式:是星型模式的变体,它解决了星型模式中的一些问题,但代价很高。在雪花模式中,维度表被规范化,这有助于处理多级层次结构和M-M关系。

雪花模式

维度

维度表捕获有关业务流程的描述性上下文。每个维度都有一个主键,该主键作为外键链接到事实表。维度表包含关于事件的“谁、什么、在哪里、何时、为什么和如何”的信息。在ETL过程中加载事实表之前加载/刷新这些表。

下面是常用的维度:

  1. 一致维度——可用于多个事实的公共维度。如:客户、日期。
  2. 垃圾维度——具有不同和不相关属性组合的单个表,以避免事实表中有大量外键。用于处理标志列和快速变化的值。
  3. 退化维度——事实表的存储部分。如:交易编号。
  4. 角色扮演维度——在多个上下文中使用相同的维度键。如:日期维度键用作订单日期和发货日期。
  5. 收缩维度——另一维度的子集。

减缓维度的变化

维度是描述值,为源系统中随时间变化的度量提供上下文。维度更改需要反映在数据仓库环境中,以实现准确的报告。以下是处理SCD的可用技术。

  • 类型0:保留原始——无更改
  • 类型1:覆盖——用新记录替换旧记录
  • 类型2:添加新行——跟踪完整历史记录。将使用当前行标志。
  • 类型3:添加新属性——将跟踪部分历史记录。新列中只存储以前的值。
  • 类型4:添加小维度——将添加新维度
  • 类型5:添加最小维度和类型1维度
  • 类型6:将类型1属性添加到类型2维度
  • 类型7:双重类型1和类型2维度

事实

事实表包含有关业务的基本度量。它通常由数字值和外键组成,外键指向维护描述性信息的维度数据。

事实表被设计为低水平的统一细节(称为“粒度”或“颗粒”),这意味着事实可以在非常原子的水平上记录事件。

  1. 事务事实——捕获的特定事件(例如销售事件)的数据。
  2. 快照事实——捕获给定时间点的数据(例如,每日网站访问)
  3. 累积快照事实——捕获表总结了在流程开始和结束之间的可预测步骤中发生的度量事件。(例如多步骤工作流跟踪)

无事实事实表

不包含任何度量的事实表称为无事实事实。此表将只包含来自不同维度表的键。这通常用于解决多对多基数问题。

例如,一个学生在某一天上课的事件可能没有记录的数字事实,但事实行带有时间、学生、老师、地点和班级的外键是明确的。它可以回答如下问题。

  1. 由特定老师教的学生是谁?
  2. 哪位老师教的学生最多?
  3. 哪个学生的教师人数最多?
  • 切片——切割——钻取
  • 切片——特定维度的数据,例如产品的销售。
  • 切割——是通过为立方体的一个维度选择一个值来拾取立方体的矩形子集,从而创建一个维度更少的新立方体。
  • 切块——切块操作生成一个子立方体,用于拾取多维的特定值。
  • 钻取——是从摘要数据转到详细级别数据的过程。

维度层次结构

高度非规范化的维度表,需要在同一个表中存储多个级别的数据。例如,产品类别、存储在不同列中的子类别值。下面是用于处理维度层次结构的技术。

固定深度位置层次——固定深度层次是一系列的多对一关系,如产品→品牌→类别→部门,对于商品而言,每个部门会有多个类别,每个类别又会有多个品牌,每个品牌下又会有多个产品。

当固定层次定义完成后,层次类别就有了商定的名称,层级级别应作为不同的位置属性存在维表中,如产品→品牌→类别→部门,应有4个字段来分别对应层次的每一级别,而不是将该层次存储成一个字段。

与其他技术相比,固定层次关系是最好理解和导航(navigate)的层次关系,同时它也能提供快速且可预测的查询性能。如果层次关系不是多对一的关系,或者层次级别各不相同以致没有固定的商定名称,那么需要使用以下的可变深度层次技术。

轻微参差不齐 / 可变深度层次——轻微参差不齐的层次虽然没有固定的层级级别,但深度的变化范围很小,如地理层次深度通常都在3~6层。

对于这种情况而言,与其使用复杂的处理不可预测的可变层次的技术,不妨将其转换为固定深度的设计,同时用维度属性来确定最大的级别数,然后基于规则填充属性值。回填是填充属性的一种常用方式,他将属性向下虚拟,如二级、三级为空,则用一级属性值对二三级进行填充。

具有层次桥接表的参差不齐 / 可变深度层次——在数仓建模中,对于有层次关系的维度表,一种建模方式是建立父子表,该方式建表在层次深度可变时尤其有用,是一种紧凑而有效的建模方式。

但是该方法也有缺点:在关系型数据库中,不定深度的层次很难建模和查询,用标准SQL很难对递归结构进行操作。尽管SQL扩展和OLAP访问语言对递归的父/子关系提供了一些支持,但是这种方式也很有局限性。

具有路径字符属性的可变深度层次——可以在维度中采用路径字符属性,以避免使用桥接表示可变深度层次。

多层标准层次分析需求可以通过标准SQL处理,不必采用SQL语言扩展。然而,路径字符方法不能确保其他层次的快速替换,也无法保证共享自身层次。路径字符方法也难于构建可变路径层次的变化,可能需要重新标记整个层次。

感谢阅读!欢迎在评论区留言,一起进步!你还可以订阅我们的YouTube频道,观看大量大数据行业相关公开课:https://www.youtube.com/channel/UCa8NLpvi70mHVsW4J_x9OeQ;在LinkedIn上关注我们,扩展你的人际网络!https://www.linkedin.com/company/dataapplab/

原文作者:Dishan
翻译作者:Chuang Zhang
美工编辑:过儿
校对审稿:Miya
原文链接:https://experiencestack.co/data-modeling-core-concepts-4028c4415e27