维度表设计方法

news/2024/11/22 17:05:23/

  • 第一步:选择维度或新建维度。作为维度建模的核心,在企业级数 据仓库中必须保证维度的唯一性。以淘宝商品维度为例,有且只允许有 一个维度定义。

  • 第二步:确定主维表。此处的主维表一般是 ODS 表,直接与业务 系统同步。以淘宝商品维度为例, s_auction_auctions 是与前台商品中心 系统同步的商品表,此表即是主维表。

  • 第三步:确定相关维表。数据仓库是业务源系统的数据整合,不同业务系统或者同 一业务系统中的表之间存在 关联性。根据对业务的梳 理,确定哪些表和主维表存在关联关系,并选择其中的某些表用于生成维度属性。

  • 第四步 :确定维度属性 。本步骤主要 包括两个阶段,其中第 一 个阶 段是从主维表 中选择维度属性或生成新的维度属性;第 二个阶段是从相 关维表中选择维度属性或生成新 的维度属性。以淘宝商品维度为例,从 主维表 (s_auction_auctions)和类目、 SPU、卖家、店铺等相关维表中 选择维度属性或生成新 的维度属性。

八、三范式与反范式

范式是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。

       关系数据库中的关系必须满足一定的要求,即满足不同的范式。大数据生态中,各类强大的查询引擎层出不穷,相对廉价的磁盘和分布式技术,也让数据冗余变得可接受甚至更加方便。

       在创建一个数据库的过程中,范化是将其转化为一些表的过程,这种方法可以使从数据库得到的结果更加明确。这样可能使数据库产生重复数据,从而导致创建多余的表。范化是在识别数据库中的数据元素、关系以及定义所需的表和各表中的项目等这些初始工作之后的一个细化的过程。

1、第一范式

1NF要求属性具有原子性,即列不可再分解;

表:字段1、 字段2(字段2.1、字段2.2)、字段3 ......

如学生(学号,姓名,性别,出生年月日)

有些钢筋可能要问西红柿了,姓名可以拆成姓、名两列, “出生年月日” 也可以拆成年、月、日三个字段。所以就不满足第一范式了!!!这里再强调一下原子性,原子性是根据使用方便来自定义的最小单位。中国人一般姓名一起用,美国就习惯姓名分别存两字段。

2、第二范式

2NF要求记录有惟一标识,即不存在部分依赖;

简单来说就是拆表,以人为粒度做一张明细表,以课程号为粒度做一张维度表,两表关联使用,消除了数据冗余

表:学号、课程号、姓名、学分;

这个表明显说明了两个事务:学生信息, 课程信息;由于非主键字段必须依赖主键,这里学分依赖课程号姓名依赖与学号,所以不符合二范式。

可能会存在问题:

  • 数据冗余:

每条记录都含有相同信息;

  • 删除异常:

删除所有学生成绩,就把课程信息全删除了;

  • 插入异常:

学生未选课,无法记录进数据库;

  • 更新异常:

调整课程学分,所有行都调整。

正确做法: 
学生:

Student

(学号, 姓名); 
课程:

Course

(课程号, 学分); 
选课关系:

StudentCourse

(学号, 课程号, 成绩)。

3、第三范式

3NF是对字段的

冗余性

,要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖;

表: 学号, 姓名, 年龄, 学院名称, 学院电话

因为存在依赖传递: (学号) → (学生)→(所在学院) → (学院电话) 。

可能会存在问题:

  • 数据冗余:

有重复值;

  • 更新异常:

有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况 。

正确做法:

学生:(学号, 姓名, 年龄, 所在学院);

学院:(学院, 电话)。

4、反范式化

一般说来,数据库只需满足第三范式(

3NF

)就行了。

    没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余,

达到以空间换时间的目的

  〖例〗:有一张存放商品的基本表,如表1所示。“金额”这个字段的存在,表明该表的设计不满足第三范式,因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额”这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。

    在

Rose 2002

中,规定列有两种类型:数据列计算列。“金额”这样的列被称为“计算列”,而“单价”和“数量”这样的列被称为“数据列”。

5、范式化设计和反范式化设计的优缺点

5.1 范式化 (时间换空间)

优点:

  • 范式化的表减少了数据冗余,数据表更新操作快、占用存储空间少。

缺点:

  • 查询时需要对多个表进行关联,查询性能降低。 
  • 更难进行索引优化

5.2 反范式化(空间换时间)

反范式的过程就是通过冗余数据来提高查询性能,但冗余数据会牺牲数据一致性

优点:

  • 可以减少表关联
  • 可以更好进行索引优化

缺点:

  • 存在大量冗余数据
  • 数据维护成本更高(删除异常,插入异常,更新异常)

6OLAPOLTP中范式设计

OLAP 一般冗余比较多,以查询分析为主,这种一般都是采用反范式设计,以提高查询效率。更新一般是定时大批量数据插入。

OLTP 则是尽可能消除冗余,以提高变更的效率。因为这种应用无时无刻不在频繁变化。


http://www.ppmy.cn/news/58067.html

相关文章

聚观早报|苹果版余额宝四天吸金69亿;​微软拟推出私有版ChatGPT

今日要闻:苹果版余额宝四天吸金69亿元;称微软拟推出私有版ChatGPT;特斯拉上调Model 3、Model Y售价;好莱坞编剧将举行15年来首次罢工;字节跳动要在美国卖书了 苹果版余额宝四天吸金69亿元 早些时候,苹果推…

【python知识】__init__.py的来龙去脉

目录 一、说明 二、包-模块-函数结构 2.1 包、模块、函数的关系 2.2 __init__.py的角色 2.3 识别包 三、__init__.py的功效 3.1 建立一个工程包 3.2 用__init__.py简化工程包 3.3 过滤 3.4 设置顶级全局变量 四、其它更多用法 4.1 高级应用 4.3 Python 3.3 及更高…

【Python】序列类型①-列表

文章目录 1. 前言2. 列表的定义3. 列表的下标访问3.1 嵌套列表的下标 4. 列表的切片操作5. 列表的遍历5.1 使用for循环进行遍历5.2 while循环进行遍历 6.添加列表元素6.1 使用append方法添加元素6.2 使用insert方法添加元素 7. 列表的拼接7.1 使用 进行拼接7.2 使用extend 进行…

语义分割学习笔记(五)U-net网络

推荐课程:U-Net网络结构讲解(语义分割)_哔哩哔哩_bilibili 感谢博主霹雳吧啦Wz 提供视频讲解和源码支持,真乃神人也! 目录 1. U-net网络模型 2. 分割效果 3. U-Net源码解析(Pytorch版) 4. 测试结果 1. U-net网络模型 U-Net网络由两部分…

部署LVS-DR集群

引言 一、LVS-DR工作原理 LVS-DR(Linux Virtual Server Director Server)工作模式,是生产环境中最常用的一 种工作模式。 LVS-DR 模式,Director Server 作为群集的访问入口,不作为网关使用节点 Director Server 与 …

做程序员需要什么基础?自学编程难度有多大?初级程序员的工资?程序员要学

今天呢 我来彻底讲一下学编程做程序员 大家最关心的4个问题 文章比较长 耐心看完 如果你打算做程序员 这篇文章一定会建立你的信心 并且给你一个正确的学习方向 第一程序员的学历要求 如果你想去百度腾讯华为 字节这种一线大厂做程序员 那你至少要二本以上学历 最好呢还是计算机…

《算法训练营》语言基础(゚Д゚

👂 无论你多怪异我还是会喜欢你(《刺客伍六七》动画推广版片尾曲) - 周子琰 - 单曲 - 网易云音乐 一起补基础! φ(゜▽゜*)♪ 👂 My Nams Suzie - Susie/Farfashah …

http协议(一)/应用层

学习目标:⭐理解应用层的作用,理解协议,理解序列化和反序列化,并且实现网络版计算器⭐HTTP协议。⭐手写一个简单的http协议。 应用层 我们写的一个个解决实际问题, 满足我们日常需求的网络程序, 都是在应用层。 协议/序列化与反…