2011-05-09 44 views
4

背景:如何从多个数据库中汇总数据?

我应该说这是说我是而不是试图让某人为我做我的工作。我觉得我处在一个十字路口,有多种方式可以实现我的目标,但我不确定哪些是“标准”的,或者我的相对有限的知识是否缺乏。

我已经有了一个已经进行了6个月的系统了,自1月11日以来,数据库模式一直非常稳定。 (我也不知道是我正在作出重大失误创造了每个月每月会计周期对应的数据库,但我只是没有足够的专业知识做,否则

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

坏数据库设计通常后自己的报告。正如你发现的那样,在不同的数据库中为每个月的数据创建一个报告噩梦。想象一下,如果会计周期日期发生变化会发生什么?更好的解决方案是将数据整合到一个数据库中,在这个数据库中确定条目的会计周期属性(输入日期,发布日期等)。

在此期间,我认为最好的解决方案是创建一个统一数据库,并使用来自其他数据库的SSIS填充它,直到您可以更新中间层或UI以使用整合设计。

+1

是的 - 现在解决这个问题之前,它变得更糟! – Cheeso 2011-05-09 17:46:03

+0

谢谢你的建议。好奇,如果你碰巧知道 - 我想这可能是我进入分析服务的机会 - 我是否认为这是基础?我的基本理解是,如果你需要大量的基于静态数据透视表的,它要走的路... – 2011-05-09 17:47:45

+0

@Gabriel - 分析服务可以帮助,但它也可能没有必要。按周期分析会计数据是一个常见问题,通常可以在不需要数据仓库的情况下解决。但是,这两种解决方案都要求OLTP数据库格式良好。 – Thomas 2011-05-09 18:14:04