當(dāng)面對(duì)大量的數(shù)據(jù),而且是各種各樣類型的數(shù)據(jù),還可能有的數(shù)據(jù)單元(粒度)很大,單純靠數(shù)據(jù)庫是不易解決,為了解決這些問題,提高系統(tǒng)后臺(tái)的效率,就需要引進(jìn)數(shù)據(jù)倉庫。
有關(guān)數(shù)據(jù)倉庫的數(shù)據(jù)存儲(chǔ)的幾個(gè)基本問題:
1、數(shù)據(jù)存儲(chǔ)的方式?
數(shù)據(jù)倉庫的數(shù)據(jù)由兩種存儲(chǔ)方式:一種是存儲(chǔ)在關(guān)系數(shù)據(jù)庫中,另一種是按多維的方式存儲(chǔ),也就是多維數(shù)組。
2、存儲(chǔ)何種數(shù)據(jù)?
數(shù)據(jù)倉庫中存在不同的綜合級(jí)別的數(shù)據(jù)。一般把數(shù)據(jù)分成四個(gè)級(jí)別,早期細(xì)節(jié)級(jí)數(shù)據(jù),當(dāng)前細(xì)節(jié)級(jí)數(shù)據(jù),輕度綜合級(jí),高度綜合級(jí)。不同的綜合級(jí)別一般稱為粒度。粒度越大,表示細(xì)節(jié)程度越低,綜合程度越高。級(jí)別的劃分是根據(jù)粒度進(jìn)行的。
數(shù)據(jù)倉庫中還有一種是元數(shù)據(jù),也就是關(guān)于數(shù)據(jù)的數(shù)據(jù)。傳統(tǒng)數(shù)據(jù)庫中的數(shù)據(jù)字典或者系統(tǒng)目錄都是元數(shù)據(jù),在數(shù)據(jù)倉庫中 元數(shù)據(jù)表現(xiàn)為兩種形式:一種是為了從操作型環(huán)境向數(shù)據(jù)倉庫環(huán)境轉(zhuǎn)換而建立的元數(shù)據(jù),它包含了數(shù)據(jù)源的各種屬性以及轉(zhuǎn)換時(shí)的各種屬性;另一種元數(shù)據(jù)是用來與多維模型和前端工具建立映射用的。
3、粒度與分割
粒度是對(duì)數(shù)據(jù)倉庫中的數(shù)據(jù)的綜合程度高低的一個(gè)衡量。粒度越小,細(xì)節(jié)程度越高,綜合程度越低,回答查詢的種類越多;反之粒度越大,細(xì)節(jié)程度越低,綜合程度越高,回答查詢的種類越少。
分割是將數(shù)據(jù)分散到各自的物理單元中去以便能分別獨(dú)立處理,以提高數(shù)據(jù)處理的效率。數(shù)據(jù)分割后的數(shù)據(jù)單元成為分片。數(shù)據(jù)分割的標(biāo)準(zhǔn)可以根據(jù)實(shí)際情況來確定,通??蛇x擇按日期、地域或者業(yè)務(wù)領(lǐng)域等進(jìn)行分割,也可以按照多個(gè)標(biāo)準(zhǔn)組合分割。
4、追加時(shí)數(shù)據(jù)的組織方式
這里說一種比較簡(jiǎn)單的情況,輪轉(zhuǎn)綜合文件。比如:數(shù)據(jù)存儲(chǔ)單位被分為日、周、季度、年等幾個(gè)級(jí)別。每天將數(shù)據(jù)記錄在日記錄集中;然后七天的數(shù)據(jù)被綜合存放在周記錄集中,每隔一季度周記錄集中的數(shù)據(jù)被存放到季度記錄集中,依此類推……這種方法把越早期的記錄存放的綜合程度越高,也就是粒度越大。
B<>數(shù)據(jù)倉庫的實(shí)現(xiàn)步驟:
一般地,設(shè)計(jì)和創(chuàng)建數(shù)據(jù)倉庫的步驟是:
1.確定用戶需求
確定終端用戶的需要,為數(shù)據(jù)倉庫中存儲(chǔ)的數(shù)據(jù)建立模型。通過數(shù)據(jù)模型,可以得到企業(yè)完整而清晰的描述信息。數(shù)據(jù)模型是面向主題建立的,同時(shí)又為多個(gè)面向應(yīng)用的數(shù)據(jù)源的集成提供了統(tǒng)一的標(biāo)準(zhǔn)。數(shù)據(jù)倉庫的數(shù)據(jù)模型一般包括:企業(yè)的各個(gè)主題域、主題域之間的聯(lián)系、描述主題的碼和屬性組。
深入地分析企業(yè)的數(shù)據(jù)源,記錄數(shù)據(jù)源系統(tǒng)的功能與處理過程。一般地,設(shè)計(jì)數(shù)據(jù)倉庫最重要的一步便是要理解商業(yè)動(dòng)作的規(guī)律,只有了解數(shù)據(jù)是如何被處理的,才能分解商業(yè)處理過程,從中獲取數(shù)據(jù)元素。
利用現(xiàn)有系統(tǒng)的信息,確定從源數(shù)據(jù)到數(shù)據(jù)倉庫的數(shù)據(jù)模型所必須的轉(zhuǎn)化/綜合邏輯。這涉及到應(yīng)該合并轉(zhuǎn)化多少數(shù)據(jù);是綜合所有的數(shù)據(jù)文件還是綜合發(fā)生變化的操作系統(tǒng)文件;轉(zhuǎn)化/綜合過程應(yīng)該多長(zhǎng)時(shí)間執(zhí)行一次等問題。決定數(shù)據(jù)轉(zhuǎn)化與更新頻率是重要的商業(yè)事件。無論數(shù)據(jù)倉庫的更新是采用事件驅(qū)動(dòng)還是時(shí)間驅(qū)動(dòng),都必須讓數(shù)據(jù)倉庫知道當(dāng)某種事件發(fā)生時(shí)就需要更新數(shù)據(jù)。
在數(shù)據(jù)倉庫建立之前,應(yīng)該寫一個(gè)詳細(xì)的方案和實(shí)現(xiàn)規(guī)劃。這種方案和實(shí)現(xiàn)規(guī)劃包括:建立商業(yè)案例、收集用戶需求、確定技術(shù)需求。建立商業(yè)案例包括由該方案解決的商業(yè)需求、方案的成本和投資的收益。收集用戶需求主要是調(diào)查用戶建立數(shù)據(jù)倉庫的意圖。用戶需求可以確定這些內(nèi)容:數(shù)據(jù)需求(粒度級(jí))、企業(yè)經(jīng)營(yíng)系統(tǒng)包含的數(shù)據(jù)、這些數(shù)據(jù)遵循的商業(yè)規(guī)則、需要提供給用戶的查詢、用戶需要的標(biāo)準(zhǔn)報(bào)告、將要使用的客戶應(yīng)用程序工具。確定技術(shù)要求包括下列內(nèi)容:硬件體系結(jié)構(gòu)和框架(例如,鏈接到數(shù)據(jù)市場(chǎng)所在的地理位置)、備份和恢復(fù)機(jī)制、安全性限制、從經(jīng)營(yíng)系統(tǒng)到數(shù)據(jù)倉庫加載數(shù)據(jù)和轉(zhuǎn)換數(shù)據(jù)的方法。
2.設(shè)計(jì)和建立數(shù)據(jù)庫
設(shè)計(jì)和建立數(shù)據(jù)庫是成功地創(chuàng)建數(shù)據(jù)倉庫的一個(gè)關(guān)鍵步驟。這一步通常由有經(jīng)驗(yàn)的數(shù)據(jù)庫設(shè)計(jì)人員使用,因?yàn)檫@一步涉及的數(shù)據(jù)來自多種數(shù)據(jù)源并且要把它們合并成一個(gè)單獨(dú)的邏輯模型。不象OLTP系統(tǒng)那樣以高度的正規(guī)化形式存儲(chǔ)數(shù)據(jù),數(shù)據(jù)倉庫中存儲(chǔ)的數(shù)據(jù)以一種非常非正規(guī)化的形式存儲(chǔ)數(shù)據(jù)以便提高查詢的性能。數(shù)據(jù)倉庫常常使用星型模式和雪花型模式來存儲(chǔ)數(shù)據(jù),作為OLAP工具管理的合計(jì)基礎(chǔ),以便盡可能快地響應(yīng)復(fù)雜查詢。
星型模式是最流行的實(shí)現(xiàn)數(shù)據(jù)倉庫的設(shè)計(jì)結(jié)構(gòu)。星型模式通過使用一個(gè)包含主題的事實(shí)表和多個(gè)包含事實(shí)的非正規(guī)化描述的維度表來執(zhí)行典型的決策支持查詢。一旦創(chuàng)建了事實(shí)表,那么可以使用OLAP工具預(yù)先計(jì)算常用的訪問信息。星型模式是一種關(guān)系型數(shù)據(jù)庫結(jié)構(gòu),在該模式的中間是事實(shí)表,周圍是次要的表,數(shù)據(jù)在事實(shí)表中維護(hù),維度數(shù)據(jù)在維度表中維護(hù)。每一個(gè)維度表通過一個(gè)關(guān)鍵字直接與事實(shí)表關(guān)聯(lián)。維度是組織數(shù)據(jù)倉庫數(shù)據(jù)的分類信息,例如時(shí)間、地理位置、組織等等。維度用于父層和子層這類分層結(jié)構(gòu)。例如,地理位置維度可以包含國(guó)家、城市等數(shù)據(jù)。因此,在該維度表中,緯度由所有的國(guó)家、所有的城市組成。為了支持這種分層結(jié)構(gòu),在維度表中需要包括每一個(gè)成員與更高層次上緯度的關(guān)系。維度關(guān)鍵字是用于查詢中心事實(shí)表數(shù)據(jù)的唯一標(biāo)識(shí)符。維度關(guān)鍵字就像主鍵一樣,把一個(gè)維度表與事實(shí)表中的一行鏈接起來。這種結(jié)構(gòu)使得很容易構(gòu)造復(fù)雜的查詢語句并且支持決策支持系統(tǒng)中向下挖掘式的分析。事實(shí)表包含了描述商業(yè)特定事件的數(shù)據(jù)。例如銀行業(yè)務(wù)或者產(chǎn)品銷售。事實(shí)表還包含了任何數(shù)據(jù)合計(jì),例如每一個(gè)地區(qū)每月的銷售情況。一般地,事實(shí)表中的數(shù)據(jù)是不允許修改的,新數(shù)據(jù)只是簡(jiǎn)單地增加進(jìn)去。維度表包含了用于參考存儲(chǔ)在事實(shí)表中數(shù)據(jù)的數(shù)據(jù),例如產(chǎn)品描述、客戶姓名和地址、供應(yīng)商信息等。把特征信息和特定的事件分開,可以通過減少在事實(shí)表中掃描的數(shù)據(jù)量提高查詢性能。維度表不包含與事實(shí)表同樣多的數(shù)據(jù),維度數(shù)據(jù)可以改變,例如客戶的地址或者電話號(hào)碼改變了。
通過降低需要從磁盤讀取數(shù)據(jù)的數(shù)據(jù)量,星型模式設(shè)計(jì)有助于提高查詢性能。查詢語句分析比較小的維度表中的數(shù)據(jù)來獲取維度關(guān)鍵字以便在中心的事實(shí)表中索引,可以降低掃描的數(shù)據(jù)行。
在轉(zhuǎn)換OLTP數(shù)據(jù)庫模式到星型模式時(shí),涉及的步驟如下:
確定事實(shí)表和維度表
設(shè)計(jì)事實(shí)表
設(shè)計(jì)維度表
實(shí)現(xiàn)數(shù)據(jù)庫設(shè)計(jì)
(1)確定事實(shí)表和維度表
確認(rèn)在OLTP系統(tǒng)中現(xiàn)有的表和數(shù)據(jù)包含了將要用在事實(shí)表和維度表中的數(shù)據(jù),是非常重要的。如果確認(rèn)不正確,那么數(shù)據(jù)倉庫的性能就比較差,在以后可能需要重新設(shè)計(jì)。重新設(shè)計(jì)一個(gè)可能包含了大量數(shù)據(jù)的數(shù)據(jù)倉庫是一項(xiàng)耗費(fèi)很大的任務(wù)。確定事實(shí)表和維度表的結(jié)構(gòu)和組成的過程比較難,特別是當(dāng)涉及多個(gè)OLTP系統(tǒng)時(shí)。
(2)設(shè)計(jì)事實(shí)表
設(shè)計(jì)事實(shí)表的主要目標(biāo)是最小化表的大小。事實(shí)表是數(shù)據(jù)庫中最大的表,因?yàn)樗鼈儼嘶镜纳虡I(yè)事務(wù)的詳細(xì)信息。然而,一定要考慮存儲(chǔ)和維護(hù)這些大表的成本。例如,大表的處理時(shí)間比較長(zhǎng)、備份和恢復(fù)的時(shí)間比較長(zhǎng)、執(zhí)行查詢的時(shí)間也比較長(zhǎng)。降低事實(shí)表大小的最簡(jiǎn)單方法如下:降低列的數(shù)量、盡可能地降低每一個(gè)列的大小、把歷史數(shù)據(jù)歸檔到單獨(dú)的事實(shí)表等。
(3)設(shè)計(jì)維度表
設(shè)計(jì)維度表的主要目標(biāo)是非正規(guī)化那么參考事實(shí)表的數(shù)據(jù)到一個(gè)單獨(dú)的表。最常用的維度數(shù)據(jù)應(yīng)該直接參考事實(shí)表,而不是通過其他維度表間接參考維度表。這種方法可以最小化表連接的數(shù)量,提高系統(tǒng)的性能。
(4)實(shí)現(xiàn)數(shù)據(jù)庫設(shè)計(jì)
當(dāng)事實(shí)表和維度表設(shè)計(jì)之后,最后一步是在Microsoft SQL Server中物理地實(shí)現(xiàn)數(shù)據(jù)庫。當(dāng)創(chuàng)建數(shù)據(jù)庫時(shí),考慮分區(qū)策略,可以使用由SQL Server提供的可以并行處理數(shù)據(jù)的文件組。當(dāng)創(chuàng)建用于存儲(chǔ)事實(shí)和維度的表時(shí),應(yīng)該盡可能地考慮數(shù)據(jù)庫的分區(qū)策略,把事實(shí)表分別存儲(chǔ)在不同的文件組上。索引可以加速數(shù)據(jù)倉庫的檢索,應(yīng)該在每一個(gè)維度表的關(guān)鍵字列上創(chuàng)建一個(gè)索引。
3.提取和加載數(shù)據(jù)
把經(jīng)營(yíng)系統(tǒng)中數(shù)據(jù)提取出來然后加載到數(shù)據(jù)倉庫中,隨著復(fù)雜性的變化而變化。如果在數(shù)據(jù)源中的數(shù)據(jù)和將要出現(xiàn)在數(shù)據(jù)倉庫中的數(shù)據(jù)是直接關(guān)聯(lián),那么這個(gè)進(jìn)程非常簡(jiǎn)單。這個(gè)進(jìn)程也可能非常地復(fù)雜,例如數(shù)據(jù)源的數(shù)據(jù)駐留在多個(gè)異構(gòu)系統(tǒng)中,并且在加載數(shù)據(jù)之前需要大量的轉(zhuǎn)變格式和修改。提取和加載數(shù)據(jù)的進(jìn)程如下:
校驗(yàn)經(jīng)營(yíng)系統(tǒng)中的數(shù)據(jù)
從經(jīng)營(yíng)系統(tǒng)中提取數(shù)據(jù)
凈化數(shù)據(jù)
把數(shù)據(jù)轉(zhuǎn)換和遷移到數(shù)據(jù)倉庫中
(1)校驗(yàn)數(shù)據(jù)
在數(shù)據(jù)從OLTP系統(tǒng)提取之前,確保數(shù)據(jù)是完全有效的是非常必要的。應(yīng)該由商業(yè)分析人員在數(shù)據(jù)源確定是有效的。對(duì)數(shù)據(jù)的任何變化應(yīng)該在經(jīng)營(yíng)系統(tǒng)中改變,而不是在數(shù)據(jù)倉庫中。校驗(yàn)數(shù)據(jù)是非常耗時(shí)的,通過寫存儲(chǔ)過程來檢查數(shù)據(jù)的域完整性來自動(dòng)化校驗(yàn)進(jìn)程。然而,手工校驗(yàn)數(shù)據(jù)也是必要的。如果發(fā)現(xiàn)了無效的數(shù)據(jù),應(yīng)該盡力找到錯(cuò)誤發(fā)生的原因和更正這些錯(cuò)誤。
(2)遷移數(shù)據(jù)
從經(jīng)營(yíng)系統(tǒng)中遷移數(shù)據(jù)一般是在數(shù)據(jù)拷貝到數(shù)據(jù)倉庫之前,把數(shù)據(jù)拷貝到一個(gè)中間數(shù)據(jù)庫中。如果數(shù)據(jù)需要凈化,那么把數(shù)據(jù)拷貝到中間數(shù)據(jù)庫中是必要的。應(yīng)該在OLTP系統(tǒng)中活動(dòng)比較低的時(shí)候拷貝數(shù)據(jù),否則會(huì)降低系統(tǒng)的性能。另外,如果該數(shù)據(jù)倉庫是由來自多個(gè)相關(guān)經(jīng)營(yíng)系統(tǒng)中的數(shù)據(jù)構(gòu)成,應(yīng)該確保數(shù)據(jù)遷移發(fā)生在系統(tǒng)同步的時(shí)候。如果經(jīng)營(yíng)系統(tǒng)不同步,那么數(shù)據(jù)倉庫中的數(shù)據(jù)可能會(huì)產(chǎn)生預(yù)想不到的錯(cuò)誤。在Microsoft SQL Server 7中,Microsoft SQL Server Data Transformation Services Import and Export wizards可以用來創(chuàng)建一系列任務(wù),可以把數(shù)據(jù)從異構(gòu)經(jīng)營(yíng)系統(tǒng)中拷貝到一個(gè)運(yùn)行SQL Server的中間數(shù)據(jù)庫中。
(3)數(shù)據(jù)凈化
數(shù)據(jù)凈化就是使數(shù)據(jù)達(dá)到一致性。在多個(gè)經(jīng)營(yíng)系統(tǒng)中,可能有相同的數(shù)據(jù)。例如,一個(gè)名稱為ABC Cooperation的公司可能被寫成ABC Co、ABC、ABC Cooperation等。如果這些名稱不一致,那么在查詢的時(shí)候就會(huì)將這個(gè)公司作為兩個(gè)不同的公司處理。如果在數(shù)據(jù)倉庫中的數(shù)據(jù)生成一致的信息,那么該公司的名稱必須完全一致。
數(shù)據(jù)凈化可以通過下面幾種方法得到:
在從OLTP系統(tǒng)拷貝到中間數(shù)據(jù)庫或者數(shù)據(jù)倉庫時(shí),使用SQL Server的數(shù)據(jù)轉(zhuǎn)換服務(wù)的數(shù)據(jù)引入引出向?qū)薷臄?shù)據(jù)
寫一個(gè)連接數(shù)據(jù)源的Microsoft ActiveX腳本或者Visual C++程序,由DTS API程序執(zhí)行,來凈化數(shù)據(jù)
例如,在定單系統(tǒng)中,這些數(shù)據(jù)需要凈化:State(必須總是兩個(gè)字符的值)以及ProductName(必須是產(chǎn)品的完整名稱,不能使用縮寫)。那么,在拷貝數(shù)據(jù)的進(jìn)程中,可以使用數(shù)據(jù)轉(zhuǎn)換服務(wù)的引入引出向?qū)z查State的值,使其為兩個(gè)字符的值,通過寫Visual C++程序可以保證產(chǎn)品的名稱為完整的名稱。一旦數(shù)據(jù)凈化之后,就可以把數(shù)據(jù)移動(dòng)到數(shù)據(jù)倉庫中。
(4)轉(zhuǎn)換數(shù)據(jù)
在數(shù)據(jù)的遷移進(jìn)程中,一般地,經(jīng)常需要把經(jīng)營(yíng)數(shù)據(jù)轉(zhuǎn)換成一種單獨(dú)的格式,以便適應(yīng)數(shù)據(jù)倉庫的設(shè)計(jì)。例如,轉(zhuǎn)換數(shù)據(jù)可以包括下列內(nèi)容:把所有的字母字符轉(zhuǎn)變成大寫字母;重新計(jì)算匯總數(shù)據(jù);把單個(gè)數(shù)據(jù)分解成多個(gè)數(shù)據(jù),例如把格式為nnnn-description的產(chǎn)品代碼分解成單獨(dú)的代碼和描述值;把多個(gè)數(shù)據(jù)合并成一個(gè)數(shù)據(jù),例如把姓和名合成一個(gè)數(shù)據(jù)姓名;把數(shù)據(jù)從一種表示形式映射成另外一種表示形式。例如把數(shù)據(jù)(1, 2, 3, 4)轉(zhuǎn)換成(I, II, III, IV);由于數(shù)據(jù)已經(jīng)被凈化了,所以數(shù)據(jù)轉(zhuǎn)換進(jìn)程發(fā)生在遷移進(jìn)程中,這時(shí)數(shù)據(jù)要么從經(jīng)營(yíng)數(shù)據(jù)庫中要么從中間數(shù)據(jù)庫中拷貝到數(shù)據(jù)倉庫中。