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ć OriginalID
s 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 № 1To 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
);