2016-08-15 7 views
2

관계형 데이터베이스 (ROLAP)에서 스타 스키마를 사용하여 간단한 다차원 데이터 모델을 구축하고자합니다. 이를 위해 팩트 테이블과 차원 테이블 두 개를 만듭니다. 먼저 운영 소스에서 데이터를 복사하고이 데이터를 처리합니다 (단순화 된 ETL 프로세스).이 다차원 모델에서 올바르지 않은 것은 무엇입니까?

내 모델에는 datestatus의 두 가지 치수 만 있습니다. 측정 : 특정 상태의 수 (한 번)

시간 차원 테이블 :

테이블있다
CREATE TABLE [dbo].[tbl_date_dim] ( 
    [ID][int]  IDENTITY(1,1) NOT NULL, 
    [date_key][int] NOT NULL primary key, 
    [Year][int]  NOT NULL, 
    [Month][int] NOT NULL, 
    [Day][int]  NOT NULL   
); 

-tbl_application이 -있는 전체 시간 범위 (필드 VersionDate)에 저장된다. 따라서, 시간 차원 테이블은 내가 이런 식으로 작성하고 있습니다 :

INSERT INTO [dbo].[tbl_date_dim] 
    ([date_key], 
    [Year], 
    [Month], 
    [Day]) 
(
    SELECT DISTINCT 
    CAST(YEAR(VersionDate) as VARCHAR(4)) + 
    RIGHT('00' + CAST(MONTH(VersionDate) as VARCHAR(2)) ,2) + 
    RIGHT('00' + CAST(DAY(VersionDate) as VARCHAR(2)), 2) as 'date_key', 
    YEAR(inner_data.VersionDate) as 'Year', 
    MONTH(inner_data.VersionDate) as 'Month', 
    DAY(inner_data.VersionDate)  as 'Day' 
    FROM (
     SELECT 
      VersionDate 
     FROM [dbo].[tbl_application] 
) AS inner_data 
); 

상태 차원 테이블을 : 나는 모든 기존 테이블 tbl_applicationstatus를 사용합니다.

다음으로 사실 테이블을 만듭니다. 차원 테이블과 측정 값에 대한 외래 키를 포함합니다.

CREATE TABLE [dbo].[tbl_olap_fact] (
    [ID][int] IDENTITY(1,1) NOT NULL,  

    [status_id][int] NOT NULL,   // FK 
    [date_dim][int] NOT NULL,   // FK 

    [staus_name] varchar(100) NOT NULL, // Non additive measure 
    [transaction_id][int] NOT NULL,  // Additive measure 

    CONSTRAINT [PK_tbl_olap_fact] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY]; 

transaction_id - 나는 집계됩니다이 필드 (상태의 수).

ALTER TABLE [dbo].[tbl_olap_fact] ADD CONSTRAINT [FK_tbl_olap_fact_tbl_date_dim] FOREIGN KEY([date_dim]) 
REFERENCES [dbo].[tbl_date_dim] ([date_key]); 

ALTER TABLE [dbo].[tbl_olap_fact] ADD CONSTRAINT [FK_tbl_olap_fact_tbl_applicationstatus] FOREIGN KEY([status_id]) 
REFERENCES [dbo].[tbl_applicationstatus] ([ID]); 

가 그럼 난 사실 테이블을 채우기 :

INSERT INTO [dbo].[tbl_olap_fact] 
    ([transaction_id], 
    [status_id], 
    [staus_name], 
    [date_dim]) 
(
    SELECT DISTINCT 
    core.id   as 'transaction_id', 
    core_status.ID as 'status_id', 
    core_status.name as 'status_name', 
    CAST(YEAR(core.VersionDate) as VARCHAR(4)) + 
    RIGHT('00' + CAST(MONTH(core.VersionDate) as VARCHAR(2)) ,2) + 
    RIGHT('00' + CAST(DAY(core.VersionDate) as VARCHAR(2)), 2) as 'date_dim' 
    FROM 
    [dbo].[tbl_application] as core 
     inner join tbl_applicationstatus as core_status 
     on core.ApplicationStatusID = core_status.ID 
    WHERE IsRaw = 0 
); 

내가 몬드리안을 사용하고 OLAP 서버로

다음, 나는 사실 테이블과 차원 테이블 간의 관계를 추가 할 수 있습니다. 다차원 데이터베이스의 논리적 모델을 정의 몬드리안 스키마 : 나는 쿠 웹 로그 분석을 사용하고있어 OLAP 클라이언트로

<Schema name="olap_schema"> 
    <Dimension type="TimeDimension" visible="true" highCardinality="false" name="Date first dim"> 
    <Hierarchy name="date_hierarchy" visible="true" hasAll="true" primaryKey="date_key" description=""> 

     <Table name="tbl_date_dim" schema="dbo"> 
     </Table> 

     <Level name="" 
      visible="true" 
      table="tbl_date_dim" 
      column="Year" 
      nameColumn="Year" 
      type="Numeric" 
      uniqueMembers="true" 
      levelType="TimeYears" 
      hideMemberIf="Never" 
      description="">   
     </Level> 

     <Level name="" 
      visible="true" 
      table="tbl_date_dim" 
      column="Month" 
      nameColumn="Month" 
      ordinalColumn="Month" 
      type="Numeric" 
      uniqueMembers="false" 
      levelType="TimeMonths" 
      hideMemberIf="Never" 
      description=""> 
     </Level> 

     <Level name="" 
      visible="true" 
      table="tbl_date_dim" 
      column="Day" 
      nameColumn="Day" 
      ordinalColumn="Day" 
      type="Numeric" 
      uniqueMembers="false" 
      levelType="TimeDays" 
      hideMemberIf="Never" 
      description=""> 
     </Level> 

    </Hierarchy> 
    </Dimension> 

    <Dimension type="TimeDimension" visible="true" highCardinality="false" name="Date second dim"> 
    <Hierarchy name="date_hierarchy" visible="true" hasAll="true" primaryKey="date_key" description=""> 
     <Table name="tbl_date_dim" schema="dbo"> 
     </Table> 

     <Level name="" 
      visible="true" 
      table="tbl_date_dim" 
      column="Year" 
      nameColumn="Year" 
      type="Numeric" 
      uniqueMembers="true" 
      levelType="TimeYears" 
      hideMemberIf="Never" 
      description=""> 
     </Level> 

     <Level name="" 
      visible="true" 
      table="tbl_date_dim" 
      column="Month" 
      nameColumn="Month" 
      ordinalColumn="Month" 
      type="Numeric" 
      uniqueMembers="false" 
      levelType="TimeMonths" 
      hideMemberIf="Never" 
      description=""> 
     </Level> 

     <Level name="" 
      visible="true" 
      table="tbl_date_dim" 
      column="Day" 
      nameColumn="Day" 
      ordinalColumn="Day" 
      type="Numeric" 
      uniqueMembers="false" 
      levelType="TimeDays" 
      hideMemberIf="Never" 
      description=""> 
     </Level> 

    </Hierarchy> 
    </Dimension> 

    <Dimension type="StandardDimension" visible="true" highCardinality="false" name="Status dimension"> 
    <Hierarchy name="status_hierarchy" visible="true" hasAll="true" primaryKey="ID" description=""> 
     <Table name="tbl_applicationstatus" schema="dbo"> 
     </Table> 
     <Level name="" 
      visible="true" 
      table="tbl_applicationstatus" 
      column="Name" 
      nameColumn="Name" 
      type="String" 
      uniqueMembers="true" 
      levelType="Regular" 
      hideMemberIf="Never" 
      description=""> 
     </Level> 
    </Hierarchy> 
    </Dimension> 

    <Cube name="enrollment_cube" caption="" visible="true" description="" cache="true" enabled="true"> 
    <Table name="tbl_olap_fact" schema="dbo"> 
    </Table> 

    <DimensionUsage source="Date first dim" name="X axis" caption="" visible="true" foreignKey="date_dim" highCardinality="false"> 
    </DimensionUsage> 

    <DimensionUsage source="Date second dim" name="Y axis" caption="" visible="true" foreignKey="date_dim" highCardinality="false"> 
    </DimensionUsage> 

    <DimensionUsage source="Status dimension" name="Z axis" caption="" visible="true" foreignKey="status_id" highCardinality="false"> 
    </DimensionUsage> 

    <Measure name="TotalCount" column="transaction_id" aggregator="count" caption="Total" visible="true"> 
    </Measure> 

    </Cube> 

</Schema> 

.

enter image description here

기본적으로, 정확한 데이터를 얻을 수 -하지만 꽤 확실하지 않다. 예를 들어, 사실 테이블을 채우는 데 사용하는 올바른 방법이 있습니까? ETL 프로세스를 제대로 구축하고 있습니까? 이것은 테스트 모드이며 데이터웨어 하우스 및 다차원 모델을 구축 할 때 몇 가지 실험을합니다.

정보에 대해 매우 감사드립니다. 모두에게 감사드립니다.

답변

1

여기에 면책 조항 : 나는 몬드리안을 사용한 적이 없으며, 여기에 제시 할 조언은 일을하는 Kimball 방식에 가깝고 일반적입니다. 몬드리안에게 스키마에 대한 몇 가지 특별한 변경이 필요한 경우, 그것을 위해 가십시오.


tbl_date_dim

이 좋은 시작이다 - 날짜 차원은 매우 중요하다. 별도의 시간 차원을 원할 수도 있습니다 (예를 들어 시간별로 보려는 경우).

ID 열을 제거하는 것이 좋습니다. 어떤 목적을 위해 봉사합니까?각 YYYYMMDD 값은 고유 할 것이고 표준 패턴은 단순히 그 테이블의 대리 키로 사용하는 것입니다.

아마도이 표에 더 많은 열을 추가 할 수도 있습니다. 당분간은 실제 날짜가있는 날짜 열을 추가하는 것이 좋습니다.이 날짜는이 측정 기준의 비즈니스 키입니다. 각 차원에는 대리 키와 비즈니스 키가 항상 있어야합니다.

이 용어에 익숙하지 않은 경우 비즈니스 키 개념을 읽으십시오. 기본적으로 의미있는 이름으로 특정 차원 멤버를 참조 할 때 사용할 수 있습니다. 이름은 종종 일종의 이름입니다. 사람들은 흔히 소스 시스템에서 무의미한 코드 나 도움이되지 않는 약어를 사용하는 실수를 저 지르지 만 실제로는 피해야합니다.

나는 tbl_date_dim을 다르게 배치 할 것을 제안합니다. 물론, 당신이하고있는 방식은 지금은 효과가 있지만, 당신의 날짜 차원은 많은 다른 테이블에 의해 참조되고 결국 당신은 그것이 필요한 날짜를 찾을 수 있습니다. 표준 솔루션은 이것을 스크립팅하거나 스프레드 시트를 함께 가져 와서 가져와 적절한 날짜 범위를 과거와 미래에 포함시키는 것입니다. 그렇게 큰 것은 아니기 때문에 크기가 실제로 문제가되지 않습니다. 스크립트를 작성하려면 약간의 검색만으로 작업을 수행 할 수있는 스크립트를 찾을 수 있어야합니다.

tbl_applicationstatus

그것은 당신이 DDL을 표시하지 않는 한이에 대해 언급하기 어렵다. 하지만 전체 소스 테이블을 사용하지 않아야합니다. 데이터웨어 하우스에 생성 된 대리 키 (ID 열이 잘되고 application_status_key와 같은 이름) ​​및 비즈니스 키가 있는지 확인하십시오. 이것은 아마도 status_name입니다.

tbl_olap_fact

팩트 테이블은 같은 곡물에서 하나 개 이상의 조치를해야하고, 외래 키 테이블 치수를. 곡물을 이해하는 것이 중요합니다. 곡물이 무엇인지 생각한 다음 사실을 반영하는 의미있는 이름을 부여해야합니다. 트랜잭션과 관련된 측정 값이 더 많아지면 tbl_transaction_fact가 좋은 이름 일 수 있습니다.

tbl_application 소스 테이블에 어떤 데이터가 있는지 설명하지 않으므로 여기에서 측정하려고하는 것이 약간 분명하지 않지만, tbl_application 소스 테이블에 어떤 데이터가 있는지 설명하지 않은 것처럼 보입니다. 특정 애플리케이션 상태가 설정 되었습니까? 당신은 실제로 여기에 어떤 부가적인 측정 값을 가지고 있지 않다는 것에주의하십시오; 추가 측정 값은 합계 금액, 항목 수 등 합계가 될 수있는 값입니다.

예를 들어 이것을 수행하는 경우 먼저 큐브에 대한 질문에 대해 생각해 보시기 바랍니다. (예 : 응용 프로그램에 금전적 가치가있는 경우 "1 월에 작성된 모든 응용 프로그램은 얼마입니까?"라는 라인을 따라 무언가가 관련되어 있음)에 대답 한 다음 해당 질문에 응답 할 수있는 모델을 만듭니다.

절대적으로 카운트 할 수도 있지만 소스에 대한 transaction_id 값을 가져올 필요는 없습니다. ID 열을 셀 수 있습니다.

상태 차원에 연결하고 거기에서 이름 열을 사용하여 팩트 테이블에서 status_name을 제거해야합니다. 상태 이름은 비 추가 측정이 아닌 해당 측정 기준의 비즈니스 키입니다.

사실을 채울 때 일반적인 패턴은 비즈니스 키로 작업 한 다음 차원 자체 또는 조회 테이블에서 대리 키를 가져와 대리모만으로 사실을로드하는 것입니다 차원을 가리키는 키.


는 다양한 기술에 대한 간략한 개요를 제공하는 really handy Kimball guide있다. 개념을 찾아 볼 초기 장소와 미리 알림이 필요할 때 다시 참조하기에 편리합니다. 미리 읽어보고 저장하는 것이 좋습니다.

+1

나는 말문이 ...! 그런 상세한 답변을 주셔서 대단히 감사합니다! 나는 조심스럽게 공부할 것입니다 ... 당신의 경험을 공유해 주셔서 대단히 감사합니다! 그것은 나를 위해 매우 중요합니다. –