🔑

【DB】移行時のサロゲートキー対応とは

2023/09/29に公開

はじめに

サロゲートキーは、データベースのテーブルで使用される一意の識別子です。通常、これは自動的に生成される連番やUUIDといった値です。サロゲートキーは、データベース内のレコードを一意に識別するために使用されます。

https://e-words.jp/w/サロゲートキー.html

移行時の問題点

もし移行先のデータベースで参照先のレコードの順序やIDが異なっている場合、単純に外部キーの値をそのまま移植すると、本来の参照先とは異なるレコードに関連付けられてしまいます。そのため、データ移行や統合の際に、参照関係を維持するためにサロゲートキーを使用します。つまり、参照関係が変化しないように、参照先のレコードのサロゲートキーとマッピングすることで、データの関連性を保つのです。

具体的な例を示します。
例えば、以下の2つのテーブルがあるとします。

テーブル: Users

user_id user_name
1 Nanase
2 Miri
3 Ruka
4 Ririka

テーブル: Orders

order_id user_id order_date
1 2 2023-09-01
2 3 2023-09-05
3 1 2023-09-08

ここで、Ordersテーブルのuser_idはUsersテーブルのuser_idを外部キーとして参照しています。これにより、Ordersテーブルの各注文が特定のユーザーに関連付けられています。

マッピング上でのサロゲートキー対応を考慮せずにデータを移行する場合、UsersテーブルとOrdersテーブルを別のデータベースに移行したとします。

移行元のデータベースのUsersテーブルからデータを移行する際、ユーザーの統合や再識別、再作成が行われたとします。すると、user_idが以下のように採番によって変わってしまうことが起こり得ます。

テーブル: Users

user_id user_name
1 Hazuki(統合により再作成された)
2 Nanase
3 Miri
4 Ruka
5 Ririka

このような場合、OrdersテーブルのレコードとUsersテーブルの対応関係が崩れてしまい、注文データが正しく紐づけられなくなります。

対応例

以下は、具体的な手順の例です。

1.マッピングテーブルの作成

サロゲートキーと元のキー(ユーザーID)の対応関係を持つマッピングテーブルを作成します。このテーブルには、新しいサロゲートキーと元のキーの対応関係を保持するための列が含まれます。

マッピングテーブル: UserMapping

surrogate_key original_key(user_id)
1 2
2 3
3 1

2.マッピングテーブルの更新

マッピングテーブルを使用して、Ordersテーブルのuser_id列をサロゲートキーに対応させます。具体的には、Ordersテーブルのuser_id列の値とマッピングテーブルを参照して、対応するサロゲートキーを取得します。

Ordersテーブル: Orders

id user_id order_date
1 2 2023-09-01
2 3 2023-09-05
3 1 2023-09-08

更新後のOrdersテーブル: Orders

id user_id order_date
1 1 2023-09-01
2 2 2023-09-05
3 3 2023-09-08

3.テーブルの移行

移行後のOrdersテーブルでは、user_id列がサロゲートキーに対応しています。これにより、参照関係が正しく保たれます。

まとめ

移行先のデータベースで参照先のレコードの順序やIDが異なる場合、サロゲートキーを利用してデータの関連性を保つことができます。

参考

https://e-words.jp/w/サロゲートキー.html
https://javascript1st.com/db-347-html/

Discussion