web-dev-qa-db-ja.com

複数列の外部キーを連結する最良の方法は何ですか?

データウェアハウスを拡張して、新しいソースシステムを組み込みます。新しいシステムでは、主キーに単一の列が必要ですが、古いシステムでは2列です。

例:

create table #new_case (case_id varchar(255))

create table #old_case (patient_id int, care_event_counter int)

insert into #old_case (patient_id, Care_event_counter)
values 
(55, 1),
(55, 2),
(55, 3),
(56, 1),
(57, 1),
(57, 2)

insert into #new_case (case_id)
select cast(patient_id as varchar(55)) + '_' + cast(care_event_counter as varchar(55))
from #old_case

select * from #new_case

problem:これは大規模で非常に遅くなる必要があり、私は全体でintを使用したいと思います。

質問: 2つの整数列をインテリジェントにマージするにはどうすればよいですか?より速い値を導き出すために使用できる数学のトリックはありますか?

2
James

データウェアハウススキーマの設計では、すべてのテーブルに新しい整数の単一列キーを割り当て、ソースシステムキー(「ビジネスキー」と呼ばれることもあります)も保持することはよくあります。

キンボールさんのコメント:

運用ソースシステムによって作成された自然キーは、DW/BIシステムの制御外のビジネスルールの対象となります。たとえば、従業員が辞任して再雇用された場合、従業員番号(自然キー)が変更されることがあります。データウェアハウスがその従業員用の単一のキーを必要とする場合、永続的で、この状況で変更されない新しい永続キーを作成する必要があります。このキーは、耐久性のある超自然キーと呼ばれることもあります。最良の永続キーは、元のビジネスプロセスとは独立した形式であるため、1から始まるシーケンスで割り当てられる単純な整数である必要があります。プロファイルが変更されると、複数の代理キーが従業員に関連付けられることがありますが、永続キーは変更されません。 。

自然キー、耐久キー、超自然キー

したがって、次のようなもの:

create table new_case 
(
  case_id int identity primary key,
  patient_id int not null,
  care_event_counter int not null,
  constraint uk_case unique(patient_id,care_event_counter),
  ... 
)

他のキーを保持してインデックスを作成する必要があります。これは、新しいデータがビジネスキーに付属しているので、新しい倉庫IDに関連付ける必要があるためです。