TSQL - объединение данных из разных источников ... рефакторинг PK и FK - PullRequest
1 голос
/ 01 февраля 2012

У меня есть различные офисы и один центральный офис.Каждый офис имеет свой собственный экземпляр SQL Server 2008, поэтому каждый офис имеет свой собственный набор данных со своим собственным набором идентификаторов.

Каждый офис уже импортировал данные в головной офис и сохранял данные на наборе STAGING_Tables, который выглядит следующим образом.

DECLARE @STAGING_COUNTRY TABLE
(
  Original_CountryID INT NOT NULL, 
  OfficeID VARCHAR(10) NOT NULL,
  Data VARCHAR(200) NOT NULL
);

DECLARE @STAGING_CITY TABLE
(
  Original_CityID INT NOT NULL, 
  Original_CountryID_FK INT NOT NULL, 
  OfficeID VARCHAR(10) NOT NULL,
  OtherData VARCHAR(100) NOT NULL
);

STAGING_COUNTRY имеет исходный идентификатор каждогострока (которая, конечно, будет продублирована, так как в каждом офисе будет ID=1 для 1-го ряда в их таблице Country), а также имеет уникальное значение OfficeID, которое вместе с Original_CountryID .. принимает уникальное значение.

STAGING_CITY имеет также исходное значение ID каждой строки, уникальное значение OfficeID, представляющее каждый офис, и в данном случае от FK до CountryID, (но, конечно, на данный момент мы имеемссылка на Original_CountryID .., которая вместе с офисом может быть идентифицирована ID.

Давайте добавим несколько фиктивных строк:

/* ADD DUMMY VALUES TO STAGING_COUNTRY */ 
INSERT INTO @STAGING_COUNTRY
(Original_CountryID, OfficeID, Data) VALUES  (1, 'Office1', 'USA')

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data)
VALUES  (2, 'Office1', 'Canada')

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data)
VALUES  (3, 'Office1', 'Japan')

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data)
VALUES  (1, 'Office2', 'USA')

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data)
VALUES  (1, 'Office2', 'Italy')

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data)
VALUES  (3, 'Office2', 'Canada')

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data)
VALUES  (3, 'Office3', 'Canada')

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data)
VALUES  (2, 'Office3', 'France')

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data)
VALUES  (3, 'Office3', 'USA')



/* ADD DUMMY VALUES TO STAGING_CITY */  
INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK, OfficeID, OtherData) VALUES 
(1, 1, 'Office1', 'New York')

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK,
OfficeID, OtherData) VALUES  (2, 1, 'Office1', 'Vancouver')

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK,
OfficeID, OtherData) VALUES  (3, 1, 'Office1', 'Tokia')

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK,
OfficeID, OtherData) VALUES  (1, 2, 'Office2', 'New York')

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK,
OfficeID, OtherData) VALUES  (2, 2, 'Office2', 'Rome')

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK,
OfficeID, OtherData) VALUES  (3, 2, 'Office2', 'Vancouver')

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK,
OfficeID, OtherData) VALUES  (1, 3, 'Office3', 'Vancouver')

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK,
OfficeID, OtherData) VALUES  (2, 3, 'Office3', 'Paris')

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK,
OfficeID, OtherData) VALUES  (3, 3, 'Office3', 'New York')

Центральный головной офис хочетзапускать отчеты из центральной базы данных, которая в значительной степени содержит копии всех данных из всех офисов, но для оптимизации этой базы данных отчетов нам нужно немного переставить STAGING_Tables ... и реорганизовать данные в FINAL_Tables, которые выглядят каккак это:

DECLARE @FINAL_COUNTRY TABLE
(
  CountryID INT IDENTITY PRIMARY KEY, 
  Original_CountryID INT NOT NULL, 
  OfficeID VARCHAR(10) NOT NULL,
  Data VARCHAR(200) NOT NULL
);

DECLARE @FINAL_CITY TABLE
(
  CityID INT IDENTITY PRIMARY KEY, 
  Original_CityID INT NOT NULL, 
  CountryID_FK INT NOT NULL, 
  OfficeID VARCHAR(10) NOT NULL,
  OtherData VARCHAR(100) NOT NULL
);

ПРОБЛЕМА:
Таблицы FINAL_COUNTRY и FINAL_CITY должны быть максимально оптимизированы для целей отчетности.Эти отчеты будут написаны в хранимых процедурах T-SQL.

ВОПРОС:
Каков наилучший способ реорганизации FINAL_Tables, чтобы каждая запись имела ИСТИННЫЙ PK-идентификатор (как в оригинальном Office_Tables), и каждый FK обновляется, чтобы указывать на правильный вновь созданный PK ... на уровне сервера?

ПРИМЕЧАНИЕ:
Обратите внимание, что обапромежуточные и финальные таблицы находятся внутри одной и той же БД на сервере.Кроме того, нам по-прежнему необходимо сохранять OriginalID s на FINAL_Tables для других целей.

ЦЕЛИ:
Основная цель здесь - реорганизовать в набор таблиц, которыеможет быть легко проиндексирован для повышения производительности.

Пожалуйста, попросите дополнительную информацию, если это необходимо.

Большое спасибо в продвинутом ...

1 Ответ

0 голосов
/ 09 февраля 2012

Это, вероятно, только частичный ответ.Возможно, вы захотите добавить общий идентификатор IDENTITY в каждую из ваших промежуточных таблиц.Что-то вроде:

DECLARE @STAGING_COUNTRY TABLE 
( 
  Stage_Country_id INT IDENTITY(1,1) NOT NULL,
  Original_CountryID INT NOT NULL,  
  OfficeID VARCHAR(10) NOT NULL, 
  Data VARCHAR(200) NOT NULL 
); 

DECLARE @STAGING_CITY TABLE 
( 
  Stage_City_id INT IDENTITY(1,1) NOT NULL,
  Original_CityID INT NOT NULL,  
  Original_CountryID_FK INT NOT NULL,  
  OfficeID VARCHAR(10) NOT NULL, 
  OtherData VARCHAR(100) NOT NULL 
); 

В ваших финальных таблицах не должно быть original_ids, поскольку в них должна быть только 1 запись на город / страну.

Тогда я думаю, что вам понадобится какая-тотаблицы перекрестных ссылок для привязки ваших финальных таблиц к таблицам этапов.Это будет выглядеть так:

DECLARE @COUNTRY_xref TABLE          
( 
  country_xref_id INT IDENTITY(1,1) not null,
  CountryID INT not null,
  Stage_Country_id INT             
);          

DECLARE @CITY_xref TABLE          
(          
  city_xref_id INT IDENTITY(1,1) not null,
  CityID INT not null,           
  Stage_City_id INT not null        
);

Вы также спрашиваете, как будет выглядеть процесс загрузки / преобразования, или это было больше о схеме?

ваши финальные таблицы, вероятно, будут выглядеть так:

DECLARE @FINAL_COUNTRY TABLE 
( 
  CountryID INT IDENTITY PRIMARY KEY, 
  Data VARCHAR(200) NOT NULL 
); 

DECLARE @FINAL_CITY TABLE 
( 
  CityID INT IDENTITY PRIMARY KEY, 
  CountryID_FK INT NOT NULL,
  OtherData VARCHAR(100) NOT NULL 
); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...