日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Quick BI 的模型设计与生成SQL原理剖析

發(fā)布時(shí)間:2025/5/22 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Quick BI 的模型设计与生成SQL原理剖析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

一、摘要

?

隨著物聯(lián)網(wǎng)的告訴發(fā)展,數(shù)據(jù)量呈現(xiàn)井噴式的增長(zhǎng),如何來(lái)分析和使用這些數(shù)據(jù),使數(shù)據(jù)產(chǎn)生商業(yè)價(jià)值,已經(jīng)變得越來(lái)越重要。值得高興的是,當(dāng)前越來(lái)越多的人已經(jīng)意識(shí)到了用數(shù)據(jù)分析決定商業(yè)策略的重要性,也都在進(jìn)行著各行各業(yè)的數(shù)據(jù)分析。眾所周知數(shù)據(jù)分析的核心是數(shù)據(jù),為了更容易的分析數(shù)據(jù),數(shù)據(jù)模型的設(shè)計(jì)需要遵循一定的規(guī)范。當(dāng)前最流行的聯(lián)機(jī)分析處理(OLAP)的規(guī)范為維度建模規(guī)范。本文介紹Quick BI如何進(jìn)行維度建模,基于維度模型如何來(lái)自動(dòng)化的生成分析查詢的SQL語(yǔ)句,從而使數(shù)據(jù)分析變得更容易。

?

關(guān)鍵字: Quick BI、OLAP、維度建模、SQL

?

二、維度模型的分類

OLAP(On-line Analytical Processing,聯(lián)機(jī)分析處理)根據(jù)存儲(chǔ)數(shù)據(jù)的方式不同可以分為ROLAP、MOLAP、HOLAP。ROLAP表示基于關(guān)系數(shù)據(jù)庫(kù)存儲(chǔ)的OLAP實(shí)現(xiàn)(Relational OLAP),以關(guān)系數(shù)據(jù)庫(kù)為核心,以關(guān)系型結(jié)構(gòu)進(jìn)行多維數(shù)據(jù)的表示和存儲(chǔ);MOLAP表示基于多維數(shù)據(jù)存儲(chǔ)的OLAP實(shí)現(xiàn)(Multidimensional OLAP);HOLAP表示基于混合數(shù)據(jù)存儲(chǔ)的OLAP實(shí)現(xiàn)(Hybrid OLAP),如低層用關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ),高層是多維數(shù)組存儲(chǔ)。接下來(lái)主要介紹基于關(guān)系型數(shù)據(jù)庫(kù)的ROLAP的建模原理。

ROLAP將多維數(shù)據(jù)庫(kù)中的表分為兩類:事實(shí)表和維度表。事實(shí)表用于存儲(chǔ)維度關(guān)鍵字和數(shù)值類型的事實(shí)數(shù)據(jù),一般是圍繞業(yè)務(wù)過程進(jìn)行設(shè)計(jì),例如:銷售事實(shí)表,一般來(lái)存儲(chǔ)用戶在什么時(shí)間、地點(diǎn)購(gòu)買了產(chǎn)品,銷量和銷售額等信息。維度表用于存儲(chǔ)維度的詳細(xì)數(shù)據(jù),例如銷售事實(shí)表中存儲(chǔ)了產(chǎn)品維度的ID,產(chǎn)品維度表中存儲(chǔ)產(chǎn)品的名稱、品牌信息,兩者通過產(chǎn)品ID進(jìn)行關(guān)聯(lián)。

ROLAP根據(jù)事實(shí)表、維度表間的關(guān)系,又可分為星型模型(Star Schema)、雪花模型(Snowflake?Schema)。

1.星型模型

?

星型模型它由事實(shí)表(FactTable)和維表(DimensionTable)組成。事實(shí)表中的維度外鍵分別與相對(duì)應(yīng)的維表中的主鍵相關(guān)聯(lián),關(guān)聯(lián)之后由于形狀看起來(lái)像是一個(gè)星星,所以形象的稱為星型模型。以下示例為星型模型:其中sales_fact_1997為事實(shí)表,存儲(chǔ)客戶在某個(gè)時(shí)間、某個(gè)商店、購(gòu)買了某個(gè)產(chǎn)品,購(gòu)買量和銷售額的信息,記錄的是一個(gè)下單過程。事實(shí)表sales_fact_1997通過外鍵product_id、customer_id、time_id、store_id分別與維度表product(產(chǎn)品維表)、customer(客戶維表)、time_by_day(時(shí)間維表)、store(商店維表)相關(guān)聯(lián),關(guān)聯(lián)關(guān)系為多對(duì)一關(guān)聯(lián)。

2.雪花模型

?

雪花模型是當(dāng)有一個(gè)或多個(gè)維表沒有直接連接到事實(shí)表上,而是通過其他維表連接到事實(shí)表上時(shí),其圖解就像一個(gè)雪花,故稱雪花模型下面示例product(產(chǎn)品)維度表與product_class(產(chǎn)品類別)維度表通過product_class_id相關(guān)聯(lián),關(guān)聯(lián)關(guān)系為多對(duì)一。product_class沒有與sales_fact_1997事實(shí)表直接關(guān)聯(lián)。

?

三、基于ROLAP模型的SQL生成原理

?

模型構(gòu)建好了后,接下來(lái)的重點(diǎn)就是針對(duì)分析需求來(lái)生成滿足分析需要的SQL語(yǔ)句,然后將SQL語(yǔ)句下發(fā)到DB中來(lái)查詢數(shù)據(jù),返回分析結(jié)果。下面通過具體的需求場(chǎng)景來(lái)介紹如何生成SQL語(yǔ)句。

1.基于星型模型(或雪花模型)生成SQL

需求場(chǎng)景:

按日期、產(chǎn)品查看總的銷售額、銷售量,日期限定在1997年,總銷售額限定在1000元以上,結(jié)果按照總的銷售額倒序排列,看前5個(gè)。

?

?

2.生成SQL思路

1.分析需要用到的字段和表,目標(biāo)是明確查詢需要用到哪些表、表間關(guān)系、表上分組字段、聚合字段,確定SQL中select和from信息。

2.分析篩選條件,目標(biāo)是明確SQL中where中需過濾的值。

3.分析分組維度,目標(biāo)是明確SQL中g(shù)roup by的字段。

4.分析聚合后的篩選條件,目標(biāo)是明確having中需要過濾的值。

5.分析需要排序的列和排序類型(升序還是降序)。

6.生成結(jié)果個(gè)數(shù)限制條件

7.根據(jù)以上信息生成查詢SQL:

select 分組字段、聚合字段 from 表(含表關(guān)聯(lián)) where 篩選條件 group by 分組維度 having 聚合后的篩選條件 order by 排序信息 結(jié)果條數(shù)限制。

?

3.生成SQL?

按照上面的步驟,和本例子中的需求,分析查詢中的關(guān)鍵信息(以下步驟與生成SQL思路中的步驟一一對(duì)應(yīng))

1.用到的分組字段:the_date、product_name, 其中分組字段the_date為日粒度,需處理為年粒度:DATE_FORMAT(`the_date` , '%Y')

聚合字段:store_sales、unit_sales,聚合方式都為sum;

用到的表:sales_fact_1997、product、time_by_day;

表間關(guān)系:sales_fact_1997.?product_id=?product.?product_id

???sales_fact_1997.?time_id=?time_by_day?.time_id

2.篩選條件:

the_date`= STR_TO_DATE('1997-01-01?00:00:00' ,'%Y-%m-%d %H:%i:%s')

3.分組維度:DATE_FORMAT(`the_date` , '%Y')、product_name

4.聚合后的篩選條件:SUM(`store_sales`) > 1000

5.排序:order by 聚合后的別名 desc

6.限制結(jié)果個(gè)數(shù):limit 0,5

?

7.生成的SQL如下

SELECT

DATE_FORMAT(TIME_T_4_.`the_date` , '%Y') AS TIME_THE_5_ ,

PRODUCT_T_2_.`product_name` AS PRODUCT_PRODUCT_6_ ,

SUM(SALES_T_1_.`store_sales`) AS SALES_STORE_7_ ,

SUM(SALES_T_1_.`unit_sales`) AS SALES_UNIT_8_

FROM

`quickbi_test`.`sales_fact_1997` AS SALES_T_1_

LEFT JOIN `quickbi_test`.`product` AS PRODUCT_T_2_ ON SALES_T_1_.`product_id` = PRODUCT_T_2_.`product_id`

LEFT JOIN `quickbi_test`.`time_by_day` AS TIME_T_4_ ON SALES_T_1_.`time_id` = TIME_T_4_.`time_id`

WHERE

?

四、附錄-用到的表

下面羅列出以上示例中用到的表的建表語(yǔ)句,需要在?MySQL數(shù)據(jù)庫(kù)下執(zhí)行,其他類型數(shù)據(jù)庫(kù)需要做一些調(diào)整。

1.sales_fact_1997表

CREATE TABLE `sales_fact_1997` (

??`product_id` int(11) DEFAULT NULL,

??`time_id` int(11) DEFAULT NULL,

??`customer_id` int(11) DEFAULT NULL,

??`promotion_id` int(11) DEFAULT NULL,

??`store_id` int(11) DEFAULT NULL,

??`store_sales` decimal(19,4) DEFAULT NULL,

?

? `store_cost` decimal(19,4) DEFAULT NULL,

?

?

2.product表

CREATE TABLE `product` (

??`product_class_id` int(11) DEFAULT '0',

??`product_id` int(11) NOT NULL,

??`brand_name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,

??`product_name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,

??`SKU` double DEFAULT NULL,

??`SRP` decimal(19,4) DEFAULT '0.0000',

??`gross_weight` float DEFAULT '0',

??`net_weight` float DEFAULT '0',

??`units_per_case` smallint(6) DEFAULT '0',

?

? `cases_per_pallet` smallint(6) DEFAULT '0',

?

?

3.product_class表

CREATE TABLE `product_class` (

??`product_class_id` int(11) NOT NULL,

??`product_subcategory` varchar(50) CHARACTER SET utf8 DEFAULT NULL,

??`product_category` varchar(50) CHARACTER SET utf8 DEFAULT NULL,

??`product_department` varchar(50) CHARACTER SET utf8 DEFAULT NULL,

?

? `product_family` varchar(50) CHARACTER SET utf8 DEFAULT NULL,

?

?

4.time_by_day表

?CREATE TABLE `time_by_day` (

??`time_id` int(11) NOT NULL,

??`the_date` date DEFAULT NULL,

??`the_day` varchar(15) CHARACTER SET utf8 DEFAULT NULL,

??`the_month` varchar(15) CHARACTER SET utf8 DEFAULT NULL,

??`the_year` varchar(10) CHARACTER SET utf8 DEFAULT NULL,

??`day_of_month` smallint(6) DEFAULT NULL,

?

? `week_of_year` double DEFAULT NULL,

?

?

5.customer表

CREATE TABLE `customer` (

??`customer_id` int(11) NOT NULL DEFAULT '0',

??`account_num` double DEFAULT '0',

??`lname` varchar(100) CHARACTER SET utf8 DEFAULT NULL,

??`fname` varchar(50) CHARACTER SET utf8 DEFAULT NULL,

??`mi` varchar(20) CHARACTER SET utf8 DEFAULT NULL,

??`address1` varchar(100) CHARACTER SET utf8 DEFAULT NULL,

??`city` varchar(50) CHARACTER SET utf8 DEFAULT NULL,

??`state_province` varchar(50) CHARACTER SET utf8 DEFAULT NULL,

??`postal_code` varchar(50) CHARACTER SET utf8 DEFAULT NULL,

??`country` varchar(50) CHARACTER SET utf8 DEFAULT NULL,

??`customer_region_id` int(11) DEFAULT '0',

??`phone1` varchar(50) CHARACTER SET utf8 DEFAULT NULL,

?

? `occupation` varchar(50) CHARACTER SET utf8 DEFAULT NU

?

?

6.store表

CREATE TABLE `store` (

??`store_id` int(11) NOT NULL,

??`store_type` varchar(255) CHARACTER SET utf8 DEFAULT NULL,

??`region_id` int(11) DEFAULT '0',

??`store_name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,

??`store_number` double DEFAULT NULL,

??`store_street_address` varchar(255) CHARACTER SET utf8 DEFAULT NULL,

??`store_city` varchar(50) CHARACTER SET utf8 DEFAULT NULL,

??`store_state` varchar(50) CHARACTER SET utf8 DEFAULT NULL,

?

? `store_postal_code` varchar(50) CHARACTER SET utf8 DEFAULT NULL,

?

?

原文鏈接
更多技術(shù)干貨 請(qǐng)關(guān)注阿里云云棲社區(qū)微信號(hào) :yunqiinsight

轉(zhuǎn)載于:https://my.oschina.net/u/3827390/blog/3006008

總結(jié)

以上是生活随笔為你收集整理的Quick BI 的模型设计与生成SQL原理剖析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。