首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TSQL -将来自不同来源的数据( ...refactoring、PK和FKs )结合在一起。

TSQL -将来自不同来源的数据( ...refactoring、PK和FKs )结合在一起。
EN

Database Administration用户
提问于 2012-02-01 15:56:07
回答 1查看 137关注 0票数 0

我有不同的办事处和一个中央总部。每个office都有自己的Server实例,因此每个office都有自己的数据集和自己的ID集。

每个办事处都已经将数据导入总部,并将数据存储在一组类似于此的STAGING_Tables上。

代码语言:javascript
复制
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 (由于每个办事处在其Country表上的第一行都有ID=1 ),而且还有一个惟一的OfficeID值,与Original_CountryID ..makes一起使用的是一个唯一的值。

STAGING_CITY还具有每一行的原始ID,表示每个office的唯一OfficeID值,在本例中是对CountryID的FK (当然,在这一点上,我们可以与OfficeID一起引用Original_CountryID ..that )。

让我们添加一些虚拟行:

代码语言:javascript
复制
/* 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')

中央总部希望从一个中央dtabase运行报告,该数据库几乎包含来自所有办事处的所有数据,但是为了优化这个reporting,我们需要对STAGING_Tables ...and对FINAL_Tables中的数据进行一些重组,如下所示:

代码语言:javascript
复制
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_COUNTRYFINAL_CITY表应该尽可能优化。这些报告将用T存储过程编写.

问题:

重组FINAL_Tables的最佳方法是什么,以便每个记录都有一个真正的PK标识符(如原始Office_Tables中的那样),并且更新每个FK以指向正确的新创建的PK ...at服务器级别?

注意:

请注意,在服务器上,两个暂存表和终表都位于同一个DB中。此外,为了其他目的,我们仍然需要保持OriginalIDs在FINAL_Tables上。

目标:

这里的主要目标是将表重组为一组表,这些表可以很容易地进行索引以达到性能目的。

如果需要,请询问更多信息。

非常感谢你.

EN

回答 1

Database Administration用户

发布于 2012-05-11 19:25:34

对于PK来说,您的IDENTITY表中的FINAL_COUNTRIES键很好。你创造了一个“合成钥匙”我还将在{ OriginalCountryID,OfficeID }上添加一个UQ,以加快从阶段性数据的联接速度。

另一种选择是在仓库中使用唯一值的Countries表(例如,"USA“仅一次),然后是将OfficeID和CountryID与仓库表中的ID相关联的CountriesMap表。这将有助于性能,因为当您访问事实表时,您希望使用单个INT来关联Countries表,而不是使用INTVARCHAR() -事实表会变得更大,并且尽可能地保持它们的狭窄是很重要的。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/12055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档