2011-05-09 5 views
4

배경 :여러 데이터베이스에서 데이터를 함께 가져 오려면 어떻게해야합니까?

내가하지나를 위해 내 일을하는 사람을 얻으려고 말함으로써이 서문한다. 나는 내 목표에 도달하는 데 여러 가지 방법이있는 사거리에 있지만, 어느 것이 '표준'인지, 내 비교적 제한된 지식이 부족한 지 확실하지 않습니다.

이제 6 개월 동안 발전해 온 시스템이 있으며, 1 월 11 일부터 DB 스키마가 상당히 안정적입니다. (월별 회계 사이클에 대응하기 위해 각 달에 대한 데이터베이스를 만드는 큰 실수를하고 있는지 확실 적이 없었다,하지만 난 그냥 다른 할 수있는 노하우가 없었어요) NOW

:

내 상사가 모든 월간 데이터베이스의 레코드로 구성된 연초 보고서를 작성하라고 요청하고 있습니다.

내가 함께 메타 데이터 스키마를 넣어 내가 ETL 작업을 수행하는 응용 프로그램을 작성할 수있는 충분한 정보를 채워 : 나는 일을 시작 무엇

.

여기에 보이는 무엇을 같은 :

USE [DAMain1] 
GO 
CREATE TABLE AccountingPeriod (
    Id INT PRIMARY KEY NOT NULL, 
    Name VARCHAR(255) NOT NULL UNIQUE, 
    DateStart DATE NOT NULL, 
    DateStop DATE NOT NULL 
) 
GO 
INSERT INTO AccountingPeriod VALUES 
    (1, 'Jan11', '1/1/2011', '1/31/2011') 
    ,(2, 'Feb11', '2/1/2011', '2/28/2011') 
    ,(3, 'Mar11', '3/1/2011', '3/31/2011') 
    ,(4, 'Apr11', '4/1/2011', '4/30/2011') 
    ,(5, 'May11', '5/1/2011', '5/31/2011') 

CREATE TABLE [DBServer] (
    Id INT PRIMARY KEY NOT NULL, 
    Name VARCHAR(255) NOT NULL UNIQUE 
) 
GO 
INSERT INTO DBServer VALUES 
    (1, 'Aaron.directagents.local') 
GO 
CREATE TABLE [DBInstance] (
    Id INT PRIMARY KEY NOT NULL 
    ,DBServerId int NOT NULL REFERENCES DBServer(Id) 
    ,SchemaName VARCHAR(255) NOT NULL 
    ,CatalogName VARCHAR(255) NOT NULL 
    ,ConnectionString VARCHAR(2000) NOT NULL 
) 
GO 
INSERT INTO DBInstance VALUES 
    (1, 1, 'dbo', 'DADatabaseR2', 'Data Source=aaron\sqlexpress;Initial Catalog=DADatabaseR2;Integrated Security=True') 
    ,(2, 1, 'dbo', 'DADatabaseR3', 'Data Source=aaron\sqlexpress;Initial Catalog=DADatabaseR3;Integrated Security=True') 
    ,(3, 1, 'dbo', 'DADatabaseMarch11', 'Data Source=aaron\sqlexpress;Initial Catalog=DADatabaseMarch11;Integrated Security=True') 
    ,(4, 1, 'dbo', 'DADatabaseApr11', 'Data Source=aaron\sqlexpress;Initial Catalog=DADatabaseApr11;Integrated Security=True') 
GO 
CREATE TABLE DADB (
    Id int PRIMARY KEY NOT NULL, 
    Name VARCHAR(255) NOT NULL UNIQUE, 
    AccountingPeriodId int NOT NULL REFERENCES AccountingPeriod(Id), 
    DBInstanceId INT NOT NULL REFERENCES DbInstance(Id) 
) 
GO 
INSERT INTO DADB VALUES 
    (1, 'Direct Agents Database for January 2011', 1, 1) 
    ,(2, 'Direct Agents Database for February 2011', 2, 2) 
    ,(3, 'Direct Agents Database for March 2011', 3, 3) 
    ,(4, 'Direct Agents Database for April 2011', 4, 4) 
GO 
CREATE VIEW DADBs AS 
SELECT 
    DA.Name [Database] 
    ,AP.Name [Accounting Period] 
    ,AP.DateStart [Start] 
    ,AP.DateStop [Stop] 
    ,DS.Name [Server] 
    ,DI.SchemaName 
    ,DI.CatalogName 
    ,DI.ConnectionString [Connection] 
FROM 
    DADB DA 
    INNER JOIN AccountingPeriod AP ON DA.AccountingPeriodId=AP.Id 
    INNER JOIN DBInstance DI ON DA.DBInstanceId=DI.Id 
    INNER JOIN DBServer DS ON DI.DBServerId=DS.Id 
GO 
SELECT * FROM DADBs 
GO 

문제 :

이 그것에 대해가는 합리적인/일반적인 방법 인 경우 나도 몰라. 한 가지 일에 충분한 시간을 할애하지만, 내 자신만으로는 어떤 길로 내려갈 지 알 수 없습니다.

질문 : 설명했듯이 여러 항목의 데이터를 가져 와서 여러 데이터베이스에 집계해야한다는 것을 감안할 때 맞춤 ETL 솔루션을 구동하는 메타 데이터 테이블을 정의하는 대안이 있습니까? (내 목적으로 C# 응용 프로그램과 SSIS 프로젝트는 eqiv이지만 여기서는 Analysis Services 또는 Reporting Services를 사용할 수 있는지 알고 싶습니다.)

답변

4

잘못된 데이터베이스 디자인은 종종보고에서 뒤떨어집니다. 당신이 발견 한 것처럼, 매달 데이터를 별도의 데이터베이스에 저장하는 것은보고의 악몽을 불러 일으켰습니다. 회계주기가 바뀌면 어떻게 될지 상상해보십시오. 더 나은 솔루션은 항목의 회계주기 기반 속성 (입력 된 날짜, 게시 된 날짜 등)을 결정하는 단일 데이터베이스에 데이터를 통합하는 것입니다.

잠시 동안 가지고있는 상황에서 통합 솔루션을 사용하기 위해 중간 계층이나 UI를 업데이트 할 수있을 때까지 통합 데이터베이스를 만들고 다른 데이터베이스의 SSIS를 사용하여 채우는 것이 가장 좋은 솔루션이라고 생각합니다. .

+1

예 - 문제가 악화되기 전에 수정하십시오! – Cheeso

+0

조언 해 주셔서 감사합니다. 호기심, 당신이 알고있게되면 - 나는 이것이 Analysis Services에 들어갈 수있는 나의 기회일지도 모른다고 생각하고 있었다. 제 기본적인 이해는 정적 데이터를 기반으로 피벗 테이블이 많이 필요한 경우 이동하는 방법입니다. –

+0

@Gabriel - 분석 서비스가 도움이 될 수도 있지만 필요하지 않을 수도 있습니다. 주기 별 회계 데이터 분석은 흔히 데이터웨어 하우스가 없어도 해결되는 공통적 인 문제입니다. 그러나 두 솔루션 모두 OLTP 데이터베이스가 올바른 형식이어야합니다. – Thomas

관련 문제