CData Sync のヒストリーモードを使ってレコードの変更履歴を同期先DB に保持:Salesforce -> MySQL を例に

by Jonathan Hikita | 2022年09月24日

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 のヒストリーモードの使い方は、ジョブの設定で[ヒストリーモードを有効化]にチェックを入れるだけです。

  1. CData Sync の管理コンソールで、[接続]タブからデータソースと同期先の接続を作成します。
  2. [ジョブ]タブで、新しいジョブを作成します。
  3. ジョブ設定画面で、[タスク]をクリックして、同期するテーブルを選択します。
  4. ジョブ設定画面に戻り[Advance]タブをクリックし、[ヒストリーモード有効化]にチェックを入れます。
  5. 設定を保存します。

これだけの設定でヒストリーモードとして同期が可能です。

実際にヒストリーモード実際にしてSync の同期を実行するとこのようなデータになります。

ヒストリーモードの注意点

ヒストリーモードは、差分更新をサポートしているデータソースでのみ利用が可能です。これは元のデータがレコードに対して固有のID を持っているかという点が差分更新をサポートできるかの判断となっています。Salesforce、kintone、Dynamics365、NetSuite などの主要なSaaS では差分更新がサポートされています。

ヒストリーモードは次の同期先でのみサポートされています。今後も追加予定です。
  • SQL Server
  • MySQL
  • PostgreSQL
  • Oracle DB
  • Snowflake
  • Databricks
  • Redshift

トライアル・お問い合わせ

関連コンテンツ