/ / TSQL - Łączenie danych z różnych źródeł … refaktoryzacja PK i FK - sql-server, tsql, przechowywane-procedury

TSQL - Łączenie danych z różnych źródeł ... refaktoryzacja PK i FKs - sql-server, tsql, stored-procedures

Mam różne biura i jedną centralę. Każde biuro ma własną instancję SQL Server 2008, więc każde biuro ma własny zestaw danych z własnym zestawem identyfikatorów.

Każde biuro zaimportowało już dane do centrali i zapisało je na zbiorze STAGING_Tables które wyglądają tak.

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 ma oryginalny identyfikator każdego wiersza (który oczywiście zostanie zduplikowany, ponieważ każdy urząd będzie miał ID=1 dla pierwszego rzędu na ich Country tabeli) a także posiada unikatową OfficeID wartość, która wraz z Original_CountryID ..stwarza wyjątkową wartość.

STAGING_CITY ma też oryginał ID każdego rzędu, unikalny OfficeID wartość reprezentująca każdy urząd i w tym przypadku FK do CountryID, (ale oczywiście w tym miejscu mamy odniesienie do Original_CountryID ..że w połączeniu z urzędem ID można zidentyfikować).

Dodajmy kilka fikcyjnych wierszy:

/* 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")

Centrala chce prowadzić raporty odcentralna baza danych, która w zasadzie zawiera kopie wszystkich danych ze wszystkich biur, ale aby zoptymalizować tę bazę danych raportowania, musimy nieco przetasować STAGING_Tables ...i reorganizuj dane w FINAL_Tables wyglądają tak:

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
);

PROBLEM:
The FINAL_COUNTRY i FINAL_CITY tabele powinny być maksymalnie zoptymalizowane do celów raportowania. Raporty te będą zapisywane w procedurach składowanych T-SQL.

PYTANIE:
Jaki jest najlepszy sposób na reorganizację? FINAL_Tables aby każdy rekord miał identyfikator TRUE PK (jak w oryginale) Office_Tables) i każdy FK jest aktualizowany tak, aby wskazywał na prawy nowo utworzony PK ...na poziomie serwera?

UWAGA:
Należy pamiętać, że zarówno stoły pomostowe, jak i końcowe znajdują się w tej samej bazie danych na serwerze. Ponadto nadal musimy zachować OriginalIDs na FINAL_Tables do innych celów.

CELE:
Głównym celem jest tutaj reorganizacja w zestaw tabel, które można łatwo indeksować w celu uzyskania wydajności.

W razie potrzeby zapytaj o więcej informacji.

Wielkie dzięki w zaawansowanym...

Odpowiedzi:

0 dla odpowiedzi № 1

To prawdopodobnie tylko częściowa odpowiedź. Możesz rozważyć umieszczenie ogólnego identyfikatora IDENTITY na każdej ze swoich tabel pomostowych. Coś jak:

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
);

Twoje tabele finałowe nie powinny mieć oryginalnych identyfikatorów, ponieważ powinieneś mieć w nich tylko 1 rekord na miasto/kraj.

Wtedy myślę, że potrzebujesz jakiegoś rodzaju tabel porównawczych, aby połączyć tabele końcowe z tabelami na scenie. Wyglądałoby to tak:

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
);

Pytasz też, jak wyglądałby proces ładowania/konwersji, czy chodziło raczej o schemat?

Twoje finałowe stoły prawdopodobnie wyglądałyby tak:

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
);