4

背景:

我应该先说我不想别人为我做我的工作。我觉得我正处于一个十字路口,有多种方法可以实现我的目标,但我不确定哪些是“标准的”和/或我是否缺乏相对有限的知识。

我的系统已经发展了六个月,自 1 月 11 日以来,数据库模式一直非常稳定。(我从来不确定我是否犯了一个重大错误,为每个月创建一个与每月会计周期相对应的数据库,但我只是不知道如何做其他事情

现在:

我的老板要求我创建包含所有月度数据库记录的年初至今报告。

我开始做的事情:

我将元数据模式放在一起,并用足够的信息填充它,我可以编写应用程序来执行 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

1 回答 1

4

糟糕的数据库设计通常会在报告中出现。正如您所发现的,将每个月的数据保存在不同的数据库中会造成报告的噩梦。想象一下如果会计周期日期发生变化会发生什么?更好的解决方案是将数据整合到一个数据库中,您可以在其中确定条目的基于会计周期的属性(输入日期、发布日期等)。

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

于 2011-05-09T17:41:34.713 回答