星型模型和雪花型模型比较

文章转载
原文地址:http://blog.csdn.net/nisjlvhudy/article/details/7889422

一、概述

在多维分析的商业智能解决方案中,根据事实表和维度表的关系,又可将常见的模型分为星型模型和雪花型模型。在设计逻辑型数据的模型的时候,就应考虑数据是按照星型模型还是雪花型模型进行组织。

当所有维表都直接连接到“ 事实表”上时,整个图解就像星星一样,故将该模型称为星型模型,如图 1 。

星型架构是一种非正规化的结构,多维数据集的每一个维度都直接与事实表相连接,不存在渐变维度,所以数据有一定的冗余,如在地域维度表中,存在国家 A 省 B 的城市 C 以及国家 A 省 B 的城市 D 两条记录,那么国家 A 和省 B 的信息分别存储了两次,即存在冗余。

图1. 销售数据仓库中的星型模型

当有一个或多个维表没有直接连接到事实表上,而是通过其他维表连接到事实表上时,其图解就像多个雪花连接在一起,故称雪花模型。雪花模型是对星型模型的扩展。它对星型模型的维表进一步层次化,原有的各维表可能被扩展为小的事实表,形成一些局部的 ” 层次 ” 区域,这些被分解的表都连接到主维度表而不是事实表。如图 2,将地域维表又分解为国家,省份,城市等维表。它的优点是 : 通过最大限度地减少数据存储量以及联合较小的维表来改善查询性能。雪花型结构去除了数据冗余。

图 2. 销售数据仓库中的雪花型模型

星型模型因为数据的冗余所以很多统计查询不需要做外部的连接,因此一般情况下效率比雪花型模型要高。星型结构不用考虑很多正规化的因素,设计与实现都比较简单。雪花型模型由于去除了冗余,有些统计就需要通过表的联接才能产生,所以效率不一定有星型模型高。正规化也是一种比较复杂的过程,相应的数据库结构设计、数据的 ETL、以及后期的维护都要复杂一些。因此在冗余可以接受的前提下,实际运用中星型模型使用更多,也更有效率。

二、使用选择

星形模型(Star Schema)和雪花模型(Snowflake Schema)是数据仓库中常用到的两种方式,而它们之间的对比要从四个角度来进行讨论。

  1.数据优化

雪花模型使用的是规范化数据,也就是说数据在数据库内部是组织好的,以便消除冗余,因此它能够有效地减少数据量。通过引用完整性,其业务层级和维度都将存储在数据模型之中。

▲图1 雪花模型

相比较而言,星形模型实用的是反规范化数据。在星形模型中,维度直接指的是事实表,业务层级不会通过维度之间的参照完整性来部署。

▲图2 星形模型

  2.业务模型

主键是一个单独的唯一键(数据属性),为特殊数据所选择。在上面的例子中,Advertiser_ID就将是一个主键。外键(参考属性)仅仅是一个表中的字段,用来匹配其他维度表中的主键。在我们所引用的例子中,Advertiser_ID将是Account_dimension的一个外键。

在雪花模型中,数据模型的业务层级是由一个不同维度表主键-外键的关系来代表的。而在星形模型中,所有必要的维度表在事实表中都只拥有外键。

  3.性能

第三个区别在于性能的不同。雪花模型在维度表、事实表之间的连接很多,因此性能方面会比较低。举个例子,如果你想要知道Advertiser 的详细信息,雪花模型就会请求许多信息,比如Advertiser Name、ID以及那些广告主和客户表的地址需要连接起来,然后再与事实表连接。

而星形模型的连接就少的多,在这个模型中,如果你需要上述信息,你只要将Advertiser的维度表和事实表连接即可。

  4.ETL

雪花模型加载数据集市,因此ETL操作在设计上更加复杂,而且由于附属模型的限制,不能并行化。

星形模型加载维度表,不需要再维度之间添加附属模型,因此ETL就相对简单,而且可以实现高度的并行化。

  总结

雪花模型使得维度分析更加容易,比如“针对特定的广告主,有哪些客户或者公司是在线的?”星形模型用来做指标分析更适合,比如“给定的一个客户他们的收入是多少?”

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

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

相关文章

CSS3弹性盒子Flex

CSS3弹性盒子Flex 基础知识和术语 原文链接:https://css-tricks.com/snippets/css/a-guide-to-flexbox/ 父级(flex容器)的属性 #显示 这定义了一个flex容器; 内联或块取决于给定的值。它为所有直接的孩子提供了一个弹性环境。 .co…

如何设置winscp显示隐藏文件

不用设置 快捷键: Ctrl Alt H

python3.5学习笔记:linux6.4 安装python3 pip setuptools

文章转载自:http://www.cnblogs.com/liujian001/p/5160869.html 前言: python3应该是python的趋势所在,当然目前争议也比较大,这篇随笔的主要目的是记录在linux6.4下搭建python3环境的过程以及碰到的问题和解决过程。 另外&#…

Linux CentOS6离线安装Jupyter notebook

1、环境介绍 Linux: CentOS 6.7 Python: 2.7 2、安装python3.5 下载python3.5安装包: wget –no-check-certificate https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tgz解压到当前目录:tar -zxvf Python-3.5.0.tgzcd Python-3.5.0./configur…

private

Private Content转载于:https://www.cnblogs.com/ryueifu-VBA/p/9113114.html

Hive内部表与外部表区别详细介绍

文章转载自:http://www.aboutyun.com/thread-7458-1-1.html 1.创建内部表与外部表的区别是什么? 2.external关键字的作用是什么? 3.外部表与内部表的区别是什么? 4.删除表的时候,内部表与外部表有什么区别&#xff1f…

cloudera manager的7180 web界面访问不了的解决办法(图文详解)

说在前面的话 我的机器是总共4台,分别为ubuntucmbigdata1、ubuntucmbigdata2、ubuntucmbigdata3和ubuntucmbigdata4。(注意啦,以下是针对Ubuntu系统的) 在ubuntucmbigdata1上执行了 sudo apt-get install cloudera-manager-daemon…

pyspark与jupyter集成

最简单的一种方式: 修改环境变量 vi ~/.bashrc 添加 export PYSPARK_DRIVER_PYTHONjupyter export PYSPARK_DRIVER_PYTHON_OPTS’notebook’ source ~/.bashrc

java输入最大10位数,倒数输出(很鸡肋)

public class D { public static void main(String[] args) { System.out.println("请输入数字(最大十位数):"); Scanner sc new Scanner(System.in); int sun sc.nextInt(); System.out.println("已输…

安装Redis常见问题

Install yum -y install gcc gcc-c libstdc-devel sudo yum install tcl tar xzf redis-2.8.8.tar.gz cd redis-2.8.8.tar.gz make MALLOClibc make test Q: cc: command not found yum -y install gcc gcc-c libstdc-devel Q: 安装redis 报错 make cd src &&am…

Linux服务器重启失败,报错Readonly File system

问题背景:linux 磁盘根分区太小,在对根目录进行扩容以后,从home目录抽取一块磁盘挂载到 /root 目录下,完成以后并没有修改 /etc/fstab 文件,导致系统开机以后继续寻找执行原来的 /home目录 解决思路: 修改…

2018 ios开发者账号同意新协议加联系电话教程

苹果开发者账号经常会更新协议,需要同意新的协议账号才能正常使用。 1、首先登录苹果开发者中心https://developer.apple.com/account/ 会出现下面飘红的提示,就是提示你要同意新协议。因为苹果规则的改变,需要先到appid管理中心加个联系手机…

Django REST FRAMEWORK swagger(一)框架详解

Django REST FRAMEWORK swagger(一、框架详解) 一.Django REST SWAGGER框架图 具体见下图 二.说明 RESTFul说明 每一个URI代表一种资源; 客户端和服务器之间,传递这种资源的某种表现层; 客户端通过四个HTTP动词&…

Kylin启动异常:java.lang.outofMemoryError:Requested array size exceeds VM limit

问题背景: 1、在Kylin里跑一个较大的cube,其中这个cube是一个大表事实表,关联两张维度表,在第三步: Extract Fact Table Distinct 报错,查看Mapreduce的执行过程,发现其中有4个Reduce执行失败,…

Prism for WPF初探(构建简单的模块化开发框架)

Prism for WPF初探(构建简单的模块化开发框架) 原文:Prism for WPF初探(构建简单的模块化开发框架)先简单的介绍一下Prism框架,引用微软官方的解释: Prism provides guidance to help you more easily desi…

Linux yum 安装MariaDB

1、在 /etc/yum.repos.d/ 下建立 MariaDB.repo,内容如下: [azureusermono etc]cd/etc/yum.repos.d[azureusermonoyum.repos.d]cd /etc/yum.repos.d [azureuser@mono yum.repos.d] vi MariaDB.repo MariaDB 10.0 CentOS repository list - created 2013-08-23 13:08 UTC h…

EBITDA的计算公式

EBITDA基本原理 EBITDA最早是在20世纪80年代中期使用杠杆收购的投资机构在对那些需要再融资的账面亏损企业进行评估时开始被大量使用。他们通过计算EBITDA来快速检查公司是否有能力来偿还这笔融资的利息。玩杠杆收购的那些投资银行家们推广了EBITDA的使用,他们通过E…

Linux/Centos下安装部署phantomjs 及使用

文章转载自:http://www.cnblogs.com/10-22/articles/4383196.html PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API。它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, …

Hadoop Balancer运行速度优化

1.修改dfs.datanode.max.transfer.threads 4096 (如果运行hbase的话建议为16384),指定用于在DataNode间传输block数据的最大线程数,老版本的对应参数为dfs.datanode.max.xcievers 2.修改dfs.datanode.balance.bandwidthPerSec 31457280 ,指定DataNode…

15-[JavaScript]-ECMAScript 1

0.javaScript的发展历程 https://zhuanlan.zhihu.com/p/27985124 1、javaScript是什么? javaScript是一种web前端的描述语言,也是一种基于对象(object)和事件驱动(Event Driven)的、安全性好的脚本语言。 它…