Как собрать данные из нескольких баз данных? - PullRequest
4 голосов
/ 09 мая 2011

ФОН:

Я должен предварить это, сказав, что не пытаюсь заставить кого-то сделать мою работу за меня. Я чувствую, что нахожусь на каком-то перекрестке, где есть несколько способов достичь своей цели, но я не уверен, какие из них являются «стандартными» и / или не хватает моих относительно ограниченных знаний.

У меня есть система, которая развивается уже шесть месяцев, и с 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)

1 Ответ

4 голосов
/ 09 мая 2011

Плохой дизайн базы данных часто выдает себя за отчетность.Как вы обнаружили, хранение данных за каждый месяц в отдельных базах данных привело к кошмару отчетности.Представьте, что произойдет, если даты бухгалтерского цикла изменятся?Лучшим решением было бы объединить данные в единую базу данных, где вы определяете атрибуты записей на основе цикла бухгалтерского учета (введенная дата, дата публикации и т. Д.).

Тем временем, учитывая то, что у вас есть, я бы сказал, что лучшее решение - создать консолидированную базу данных и заполнить ее с помощью служб SSIS из других баз данных, пока вы не сможете обновить промежуточные уровни или пользовательские интерфейсы для использованиясводный дизайн.

...