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

関連コンテンツ

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

30日間無償トライアルで、CData のリアルタイムデータ連携をフルにお試しいただけます。記事や製品についてのご質問があればお気軽にお問い合わせください。