背景:
我应该先说这是因为我不试图让别人为我做我的工作。我觉得我处在一个有多种方式达到目标的十字路口,但我不确定哪些是'标准'和/或我缺乏相对有限的知识。
我的系统已经发展了六个月了,自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#app和SSIS项目是eqiv,但我很想知道是否可以在这里使用Analysis Services或Reporting Services)
答案 0 :(得分:4)
错误的数据库设计经常在报告中自行调整。正如您所发现的那样,将每个月的数据放在不同的数据库中会产生报告的噩梦。想象一下,如果会计周期日期发生变化会发生什么?更好的解决方案是将数据合并到一个数据库中,您可以在其中确定基于会计周期的条目属性(输入日期,发布日期等)。
在此期间,鉴于您所拥有的,我认为最佳解决方案是创建一个统一数据库并使用其他数据库中的SSIS填充它,直到您可以更新中间层或UI以使用整合设计。