CData Sync でレコードの変更履歴を保持したい
CData Sync は、Salesforce やkintone などのSaaS データをお好みのDB/DWH にレプリケーションしてくれるデータパイプラインツールです。400を超えるSaaS/DB データに対応しています。
CRM の案件管理データなどを扱う際に最新のデータを見るだけではなく、「この顧客はいつ確度が上がったか」「受注ターゲット日付は後ろ倒しになっていないか」などのデータの動きに注目するマネージャーは少なくありません。CData Sync のデフォルトの使い方ですと常にSalesforce などから最新のデータをDB に同期します。差分更新が実現されており、変更があったレコードは既存のレコードを上書きします。CData Sync のヒストリーモード
以下のようなテーブルがDB にSync されたとします。
ID |
UserName |
Amount |
Probability |
1 |
Taro |
1,000,000 |
20% |
2 |
Jiro |
2,000,000 |
40% |
3 |
Saburo |
3,000,000 |
60% |
4 |
Shiro |
4,000,000 |
80% |
5 |
Goro |
5,000,000 |
100% |
翌月に担当がデータを修正してSync がデータを更新します。従来の方法。
ID |
UserName |
Amount |
Probability |
1 |
Taro |
1,000,000 |
80% |
2 |
Jiro |
2,000,000 |
80% |
3 |
Saburo |
10,000,000 |
60% |
4 |
Shiro |
4,000,000 |
80% |
5 |
Goro |
5,000,000 |
100% |
最新のデータをDB から見ることができるので、良いのですが、レコードの変更履歴で動きを見たい場合にはこのままでは不足です。
すでにCData Sync では、「スナップショット機能」を使って、Sync のジョブ実行時に毎回別の実行日付きのテーブルを保存することが可能でした。サンプル記事(https://www.cdata.com/jp/blog/sync-yahooads-bigquery)
今回のヒストリーモードは、一つのテーブル内にレコードがいつ変更されたかがわかる形でデータが保存されていきます。テーブル内の変更がないレコードについては1レコードとして保存され続けるので、スナップショット機能と比べて保存されるデータの容量がぐっと少なくなります。また、同一テーブル内で編子履歴を含むデータとして保存されるので、分析時にJOIN クエリを行わなくて良い点もとっても便利です。
先ほどと同じ案件データについては、CData Sync のヒストリーモードを使って同期をすると以下のような形でデータが同期されます。
ID |
UserName |
Amount |
Probability |
_cdatasync_active |
_cdatasync_start |
_cdatasync_end |
1 |
Taro |
1,000,000 |
80% |
1 |
2022/8/30 0:00 |
|
2 |
Jiro |
2,000,000 |
80% |
1 |
2022/8/30 0:00 |
|
3 |
Saburo |
10,000,000 |
60% |
1 |
2022/8/30 0:00 |
|
1 |
Taro |
1,000,000 |
20% |
0 |
2022/7/31 0:00 |
2022/8/30 0:00 |
2 |
Jiro |
2,000,000 |
40% |
0 |
2022/7/31 0:00 |
2022/8/30 0:00 |
3 |
Saburo |
3,000,000 |
60% |
0 |
2022/7/31 0:00 |
2022/8/30 0:00 |
4 |
Shiro |
4,000,000 |
80% |
1 |
2022/7/31 0:00 |
|
5 |
Goro |
5,000,000 |
100% |
1 |
2022/7/31 0:00 |
|
CData Sync のヒストリーモードの挙動
CData Sync のヒストリーモードには以下の3つのカラムが同期先テーブルに追加されます:
- _cdatasync_active:そのレコードがActive な(ジョブ実行時点で存在している)かを示します。
- _cdatasync_start:そのレコードがSync された日付です。差分更新の最初の日付です。
- _cdatasync_end:そのレコードがActive ではなくなった日付です。レコードが更新されて、別のActive なレコードが同期された日付となります。
上の例では、ID1 のTaro さんは、8/30 のデータ更新で、案件確度が20%から80%にあがりましたので、旧レコードのActive フラグが0になり、非Active になり、_cdatasync_end になりました。同時にID1 のActive なレコードとして案件確度が80%のレコードが新たに8/30スタートのレコードとして生成されています。
もし最新のレコードだけを参照したい際は WHERE _cdatasync_active = TRUE にしていすれば重複なく最新レコードを参照できます。もし同じデータの/もしくはテーブル内のデータ全体の動きを見たい場合にはstart / end の日付を使って動きを見ることが可能です。
挿入された行:同期先テーブルに行が追加されます。_cdatasync_active はTrue に設定され、_cdatasync_start は差分チェックカラムの値に設定されます。
更新された行:①同期先の現在の行が更新されます。_cdatasync_active はFalse に設定され、_cdatasync_end は差分チェックカラムの値に設定されます。②同期先テーブルに新しい行が挿入されます。_cdatasync_active はTrue に設定され、_cdatasync_start は差分チェックカラムの値に設定されます。
削除された行: 同期先の現在の行が更新されます。_cdatasync_active はFalse に設定されます。
CData Sync のヒストリーモードの使い方
CData Sync のヒストリーモードの使い方は、ジョブの設定で[ヒストリーモードを有効化]にチェックを入れるだけです。
- CData Sync の管理コンソールで、[接続]タブからデータソースと同期先の接続を作成します。
- [ジョブ]タブで、新しいジョブを作成します。
- ジョブ設定画面で、[タスク]をクリックして、同期するテーブルを選択します。
- ジョブ設定画面に戻り[Advance]タブをクリックし、[ヒストリーモード有効化]にチェックを入れます。
- 設定を保存します。
これだけの設定でヒストリーモードとして同期が可能です。
実際にヒストリーモード実際にしてSync の同期を実行するとこのようなデータになります。
ヒストリーモードの注意点
ヒストリーモードは、差分更新をサポートしているデータソースでのみ利用が可能です。これは元のデータがレコードに対して固有のID を持っているかという点が差分更新をサポートできるかの判断となっています。Salesforce、kintone、Dynamics365、NetSuite などの主要なSaaS では差分更新がサポートされています。
ヒストリーモードは次の同期先でのみサポートされています。今後も追加予定です。
- SQL Server
- MySQL
- PostgreSQL
- Oracle DB
- Snowflake
- Databricks
- Redshift
関連コンテンツ