履歴データの操作
1)目的と原則
目的:レポート、モデル、および調査が再現可能で、正確で、準拠しているように、過去の状態を保存および処理します。
原則:- スキーマやクエリの設計明示的なタイムモデルによって時間認識。
- 再現性:日付Dの同じレポートは常に同じ結果を生成します。
- オーディタビリティ:系統、不変の層、必要に応じてWORM。
- 費用対効果:理解可能なSLAを備えたアーカイブ層、圧縮、コールドストレージ。
- プライバシー・バイ・デザイン:レトロスペクティブ取引と法的要求のためのPII管理。
2)タイムモデル
イベント時間:実際のイベントの時間(料金、デポジット)。
システムがレコードを処理した処理時間(異なる場合があります)。
Bitemporal:レトロアクティブ編集のためのイベントタイムと処理時間の両方を格納します。
有効期間:'valid_from'、' valid_to'、'is_current'。
クエリの現在:データサンプリング「彼らはTの時に知っていたように」。
sql event_time TIMESTAMP, -- event time processed_at TIMESTAMP, -- TIMESTAMP valid_from processing time, -- start of version validity valid_to TIMESTAMP, -- end of validity (NULL if current)
is_current BOOLEAN
3)ストレージ層とフォーマット
レイクハウス: ブロンズ(raw append-only)→シルバー(clean/SCD/normalization)→ゴールド(showcases)
ACID- форматы:デルタ/アイスバーグ/フーディ(MERGE/Upsert、タイムトラベル、スナップショット)。
階層型ストレージ:規制アーティファクト用のホット/ウォーム/コールド+ワーム。
パーティショニング:'event_date'、 'market'、 'tenant';頻繁な述語(ユーザー/ゲーム/プロバイダ)によるクラスタリング/Z順序。
4)測定履歴(SCD)
SCD I:上書き-クリティカルでない編集の場合。
SCD II:完全な物語;RG/KYC/トラフィックチャンネル/ゲーム属性に推奨。
SCD III: 「before/after」-まれな比較例。
sql
MERGE INTO dim. users_scd t
USING stage. users u
ON t. user_pseudo_id = u. user_pseudo_id AND t. is_current = TRUE
WHEN MATCHED AND (t. rg_status <> u. rg_status OR t. country <> u. country) THEN
UPDATE SET is_current = FALSE, valid_to = CURRENT_TIMESTAMP
WHEN NOT MATCHED THEN
INSERT (user_pseudo_id, country, rg_status, valid_from, valid_to, is_current)
VALUES (u. user_pseudo_id, u. country, u. rg_status, CURRENT_TIMESTAMP, NULL, TRUE);
5)ファクトストーリー: スナップショットとbitemporal
スナップショット:終日/月の集計(ウォレット残高など)のスナップショット-履歴レポートの再作成をスピードアップします。
Bitemporal facts:イベント時間と処理時間を修正して、遅延修正と回帰計算を区別します。
正確に一度の履歴:'event_id'+idempotent MERGEによるデッドアップ。
6)タイムトラベルと再現性
タイムトラベル:デバッグ、インシデント、和解のためのテーブルを「Tの時に」読む。
ロジックバージョニング:変換アーティファクト(SQL/DBTバージョン、コンテナ)と出力テーブルの「logic_version」ラベル。
凍結出力:ゴールドレポートアーティファクトがキャプチャされ、書き換え、ハッシュ、エクスポートログが利用できません。
sql
SELECT
FROM silver. fact_bets VERSION AS OF 1678901234567
WHERE event_date = DATE '2025-10-31';
7)バックフィルの再処理
Backfill:プライマリ/プリロード履歴範囲。
再処理:バグを修正したり、ビジネスルールを変更した後の再計算。
- Idempotency (MERGE/upsert)、 range、 quotas、 dry-runとメートル法の比較。
- 結果のマーク:'recalc_reason'、 'logic_version'、 'reprocessed_at'。
1.現在の金を凍らせて下さい;2) DLQ/DQの証明;3)銀製の実行;4)指標の比較;5)金の再建;6)出版物および署名。
8)和解
チェックサム:OLTP、 PSP/プロバイダとの販売数量/数量の調整。
ループチェック:サンプル上の独立したパイプライン(A/B比較)。
GGR ≤ 0のような許容差。1日の2%。
sql
-- Duplicates
SELECT transaction_id, COUNT() c
FROM silver. payments
GROUP BY transaction_id
HAVING COUNT() > 1;
-- Unknown Currencies/Markets
SELECT p. currency
FROM silver. payments p
LEFT JOIN ref. currencies r ON r. code = p. currency
WHERE r. code IS NULL;
9)通貨、時間、カレンダー: 歴史的正確さ
イベントの日付のFX: 'fx_rate_used'と'fx_source'を修正します。
ローカル市場時間:カレンダーディレクトリ経由のDST/タイムゾーン。
休日/季節:モデルやレポートで使用される別のカレンダーテーブル。
sql
SELECT p. transaction_id,
p. amount_orig,
r. rate AS fx_rate_used,
p. amount_orig r. rate AS amount_base,
r. fx_source
FROM bronze. payment_events p
JOIN dim. fx_rates r
ON r. date = DATE(p. event_time) AND r. ccy_from = p. currency AND r. ccy_to = 'EUR';
10) PII、コンプライアンスおよび法的保持
PII最小化:匿名化、個別の保護マッピング。
DSAR/RTBF:過去のレイヤーの計算可能な投影と選択的編集;法的ストレージ例外が文書化されています。
Legal Hold:範囲/オブジェクトのフラグ「freeze」削除、レポート可能なアーティファクトのWORM。
監査:不変のアクセスとエクスポートログ。
11)歴史のためのDQそして血統
DQ-as-code(例):yaml table: silver. fact_bets slo:
completeness_percent: 99. 5 freshness_minutes: 60 rules:
- name: unique_bet type: unique columns: [bet_id]
severity: critical
- name: market_known type: in_set column: market set_ref: ref. markets
- name: ts_in_range type: temporal expression: "event_time BETWEEN date_sub(now(), interval 5 year) AND now()"
Lineage:入力/変換/出力のバージョンを修正します。レトロフォーメーションには依存関係グラフが必要です。
12)性能および費用
仕切り:日付/市場/テナントによって;'user_pseudo_id'/'game_id'によって攻撃的なクラスタリングが頻繁にフィルタリングされる場合。
フォーマット:寄木細工+統計/圧縮;定期的な真空/最適化。
マテリアライゼーション:「高価な」歴史的集計のプリコンピュート。四半期/年次レポートのスナップショット。
アーカイブ:古いバッチをコールドストレージに変換する(リカバリ用のSLAは文書化されています)。
サンプリング:規制/金融のためではなく、研究タスクのためにのみ。
13) MLの歴史的特徴
フィーチャーレジストリ:各機能には数式、所有者、SLO、 'model_version'があります。
オンライン/オフラインの一貫性:1つの変換コードベース、再現性テスト。
特徴的なドリフト:期間によるPSI/KS、歴史的分布の保存。
14)クエリパターン
As-of:レポートの再現性。
コホート分析:登録/最初の預金、圧延ウィンドウのコホート。
ゆっくりと事実を変更します。:'SCD II('event_time BETWEEN valid_from AND COALESCE (valid_to、 '9999-12-31')')に参加します。
sql
SELECT b. bet_id, u. rg_status
FROM silver. fact_bets b
JOIN dim. users_scd u
ON u. user_pseudo_id = b. user_pseudo_id
AND b. event_time >= u. valid_from
AND (u. valid_to IS NULL OR b. event_time < u. valid_to);
15)プロセスとRACI
R(責任ある):データエンジニアリング(モデル/SCD/バックフィル)、データプラットフォーム(ACID/アーカイブ)、ファイナンス/コンプライアンス(調整/ストレージ要件)。
A(説明責任):データ/CDOの責任者。
C(コンサルティング):Legal/DPO (DSAR/RTBF/Legal Hold)、 SRE (cost/SLA)、 Architecture。
I(インフォームド):BI/製品/マーケティング/オペレーション。
16)実装ロードマップ
MVP (3-5週):1.タイムトラベル(デルタ/アイスバーグ/フーディ)と基本的なパーティショニングを備えたACIDテーブル。
2.主要寸法(ユーザー/ゲーム/プロバイダ)のSCD II。
3.重要な集計の毎日のスナップショット(GGR Daily)。
4.DQ-as-code (uniqueness/in_set/temporal)+lineage-graph。
フェーズ2(5-10週間):- Bitemporalの事実、API/SQLテンプレートとして、runbooks backfill/reprocessing。
- FX/カレンダー/DST濃縮、OLTP↔DWH/provaydery調整。
- コールドストレージのアーカイブ、パッケージを報告するためのWORM、リーガルホールド。
- 「リプレイ&what-if」の完全な自動化、メトリックと回帰アラートの比較。
- 歴史的な機能とドリフト制御ML、ストレージコストのチャージバック。
- ドキュメント「as-of」メトリクスと再現可能なレポート。
17)売り上げ前のチェックリスト
- テーブルは時間旅行を支えます;VACUUM/RETENTIONポリシーは一貫しています。
- SCD IIは重要な測定のために実装されている。参加はテスト済みだ。
- D/M上のキーユニットの写真が利用可能で、スパークルで確認できます。
- DQルールはアクティブです。lineageは入力/出力とロジックバージョンを表示します。
- DSAR/RTBF/Legal Holdは、過去のレイヤーでテストしました。
- コールドストレージのアーカイブとリカバリが文書化および検証されました。
- コスト/GB、コールドシェア、リカバリSLA
18)頻繁なミスとそれらを回避する方法
明示的なタイムモデルはありません:イベント/処理/妥当性を追加します。
FX 「retroactive」:イベント時のコースは常に'fx_source'を保存します。
SCDで無効なジョイン:'is_current'ではなく、有効間隔を使用します。
Mutating Goldショーケース:レポート可能な出力は不変(またはバージョン)でなければなりません。
血統無し/DQ:証明性とチェックポイントはありません-1日目からそれらを入力してください。
管理不可能なコスト:ホットパーティー、真空、寒さに変換をオフにします。
19)用語集
As-of-Query-データ要求「彼らはTの時間を見て」。
Bitemporal-イベントと処理時間の同時固定。
スナップショット-期間の終わりにステータス/集計のスナップショットを具現化しました。
タイムトラベル-テーブルの歴史的なバージョンを読む。
WORM-Write Once Read Many。
20)ボトムライン
過去のデータを扱うことは単に「長いストレージ」ではなく、明示的なイベント/処理/ビットモーラル、SCDおよびスナップショットモデル、要求として再現可能、厳密な調整とコンプライアンスコントロール、オブザビリティ、および費用対効果の高いストレージアーキテクチャという時間の規律です。このガイドに従うことにより、監査およびビジネスロジックの変更に耐性があるレポート、分析、およびMLのための確かな歴史的基盤が得られます。