2010-08-12 83 views
3

我正在開發一個數據倉庫,並提出了一個問題,我不知道如何解決。目前的架構定義如下:數據倉庫設計問題

DimInstructor < - 維度表教官 DimStudent < - 維度表的學生

我想要實現的場景,由此,如果在我的OLTP數據庫中的教師改變的細節,我想爲了歷史報告的原因在DimInstructor表中添加新記錄。

現在,我想創建一個名爲DimLesson的課程表。在DimLesson中,我想創建一個對教師的引用。

的DimInstructor表包含:

InstructorDWID < - 標識字段時進入DW InstructorID < - 已來自OLTP數據庫

現在的教練ID,我不能讓InstructorID主因爲它不能保證是唯一的(如果教師更改他們的名稱,DW中將有2個記錄具有相同的InstructorID值)。

所以我的問題是,我該如何引用DimLesson的教師?我使用InstructorDWID嗎?如果是這樣,我應該在DimInstructor中爲一個教師提供2個條目,當我想要查看特定教師的所有課程時,這會使查詢更加複雜。

任何幫助,將不勝感激!

回答

1

保羅,

有多種方法可以處理這個組合。您可以使用生效日期/非活動日期,序列號或版本號來區分具有相同InstructorID的記錄。捕獲所有相關細節

的DIM會像..

create table DIM_INSTRUCTOR(
    instr_guid number, --populated through a sequence  -----Composite pk-Part1 
    istr_oid number, --direct id from the OLTP system -----cmposite pk-part2 
    instr_name number, 
    other_attr varchar2(25), 
    eff_date date, 
    expiration_date date 
); 

直接從一個序列生成的instr_guid並且獨立於OLTP系統。

這會讓你捕捉給定教師的所有細節。 您可以只使用instr_guid作爲事實表的外鍵,但包括它們(instr_guid,instr_guid)會增加查詢的難易。這是Datawarehousing的目標之一。

相關鏈接:

http://en.wikipedia.org/wiki/Surrogate_key http://en.wikipedia.org/wiki/Slowly_changing_dimension#Type_2

+0

謝謝你。我將如何去引用另一個維度表中的密鑰?所以DimLessons表包含特定教師的所有課程。課表使用類型2以相同的方式起作用。 – Paul 2010-08-12 13:41:54

+0

尺寸表(通常)不應該彼此引用。它們都是獨立的實體,它是引用這些表的事實表。 從我所瞭解的情況來看,你的情景會在事實層次上有一個班級報名。每個班級的報名將在事實表中記錄。 students_dim,instructors_dim,classes_dim將包含相應的屬性。 enrollment_fact將包含這些表中每個表的鍵以及所有其他詳細信息,如enrolllment_date等。 – 2010-08-12 13:52:39

+0

我想我明白了。因此,如果我想創建基於教師,學生,課程和課程預訂的模式,那麼每個模糊表格(教師,學生,課程)將相互獨立並通過事實錶鏈接?這是有道理的,但如果生成的報告顯示的是沒有人蔘加過的講師的課程,該怎麼辦?如果在事實表中沒有沒有人出席的記錄,我將如何將講師鏈接到課程? – Paul 2010-08-12 13:57:35

0

使用GUID/UUID作爲主鍵或列

+0

您的意思是InstructorDWID?這個值將是唯一的,因爲它是一個標識列。但是,如果教師細節發生變化,教師將擁有多個InstructorDWID。示例 - InstructorDWID當前爲1,則講師將她的標題從Miss改爲Mrs.現在,我們的InstructorDWID爲1和2. 1現在已過時,2是當前的。現在引用InstructorDWID 1的課程現在已經過時了,會發生什麼? – Paul 2010-08-12 13:22:48

2

你所描述這裏通常被稱爲2型尺寸。 Kimball數據倉庫書籍有關類型2維度的全部內容和類型的ETL - 請閱讀。

首先要了解的是主鍵和業務鍵之間的區別。主鍵唯一標識表中的一行,而業務鍵則唯一標識表所描述的實體,如指導員。例如,如果一個教練改變了名稱,dimInstructor表可能看起來像:

InstructorKey InstructorBusinessKey FirstName LastName row_ValidFrom row_ValidTo row_Status 
    1234   jane_doe_7211   Jane  Doe  2000-03-11 2010-08-12  expired 
    7268   jane_doe_7211   Jane  Smith  2010-08-12 3000-01-01  current 

現在,提供了dimLesson是正確的設計爲您的商業模式(而不是有某種事實的)的dimLesson將有一個名爲InstructorKey的列。在ETL過程中,將新行(7258)發送到dimInstructor表格時,請將dimLesson中的第1234行的所有引用替換爲7268。

+0

謝謝達米爾。 dimLesson表的設計類似於dimInstructor表。示例報告可能基於課程更改名稱後課程預訂增加或減少? 我認爲你解釋的方法似乎是最有意義的。 – Paul 2010-08-12 14:34:08