EP.14 で、データ層とセマンティック層を分ける設計を扱いました。ただし現実には、すでに定義が各所に散らばった状態から始まります。
この回は、その移行の進め方を扱います。要点は、並行期間に二重管理を作らないことです。 を目指す移行なのに、その過程で情報源を増やしてしまう ── これが最も避けたい失敗です。
1. 散らばっている場所を洗い出す
まず現状を把握します。同じ指標の定義が、いくつの場所にあるかを数えます。
| 場所 | 見つけ方 | よくある状態 |
|---|---|---|
| BIツールの計算式 | レポートの定義を出力 | 最も多い |
| 個人の集計クエリ | 実行履歴から抽出 | 把握しきれない |
| 表計算のファイル | 共有ドライブを探す | 存在自体に気づかない |
| アプリのコード | リポジトリを検索 | 定義が埋め込まれている |
| 定期処理の中 | 処理の定義を確認 | 変更されにくい |
3行目が最も厄介です。表計算のファイルにある定義は、探しようがありません。移行の対象から漏れ、後から食い違いの原因として発覚します。
完全な洗い出しは不可能です。主要な場所を押さえて移行を始め、後から出てきたものを順次取り込むという進め方が現実的です。完全な把握を待つと、いつまでも始まりません。
2. 食い違いを可視化する
洗い出したら、同じ名前の指標が、実際に同じ値になるかを確認します。ここで移行の必要性が数字で示せます。
-- 「月間の売上」が、定義によっていくつになるかを並べるWITH base AS ( SELECT * FROM prod.raw.orders WHERE order_date >= '2026-08-01' AND order_date < '2026-09-01')SELECT '定義A: 全件の合計' AS 定義, SUM(amount) AS 金額 FROM baseUNION ALLSELECT '定義B: キャンセルを除く', SUM(amount) FROM base WHERE status <> 'cancelled'UNION ALLSELECT '定義C: 税抜き', SUM(amount - tax) FROM base WHERE status <> 'cancelled'UNION ALLSELECT '定義D: 返品も除く', SUM(amount - tax) FROM base WHERE status NOT IN ('cancelled', 'returned')ORDER BY 金額 DESC;同じ「月間の売上」で、4つの値が出るという結果を示せると、移行の議論が進みます。「定義を揃える必要がある」という主張より、実際に食い違っている数字のほうが説得力があります。
そして、どれが正しいかを決めるのは技術の仕事ではありません。事業側と合意する必要があります。この合意形成こそが、移行作業の本体だと考えてください。技術的な移行は数日で終わりますが、「売上とは何か」の合意には数週間かかることがあります。見積もりのときに、この時間を計算に入れてください。
3. どこから移行するか
全部を一度に移すのは無理です。優先順位をつけます。
| 優先度 | 対象 | 理由 |
|---|---|---|
| 最優先 | 食い違いが起きている指標 | 問題が顕在化している |
| 高 | 使用頻度が高い指標 | 効果が大きい |
| 中 | 複数部門で使われる指標 | 合意の価値が高い |
| 低 | 1人しか使っていない指標 | そのまま残してもよい |
| 対象外 | 一時的な分析 | 移す必要がない |
最下2行を対象外にできるのが重要です。全部を移す必要はありません。EP.14 で扱ったとおり、 は組織で共有すべき定義を置く場所であって、すべての集計を置く場所ではありません。個人の一時的な分析まで移そうとすると、移行が終わらないうえに、層が肥大化します。
4. 並行期間の設計
ここが最も重要です。移行中は新旧が並存します。この期間に二重管理を作らないための原則があります。
- 1正はどちらか、を1つに決める — 両方を正としない
- 2新しい定義で、旧と同じ結果が出ることを確認する — 差があれば理由を特定
- 3旧を新の参照に置き換える — 定義を複製しない
- 4切り替えたら、旧の定義を書き換えない — 変更は新側のみ
- 5参照がゼロになったら旧を消す — 記録で確認
3番目が要点です。旧のレポートを消さずに、その定義だけを新しい層への参照に差し替える。こうすると、定義は1箇所のままで、見た目は変わりません。利用者から見て何も変わらないという点が重要で、移行への抵抗が生まれにくくなります。
並行期間中に同じ計算式を新旧両方に書くと、二重管理が生まれます。片方だけ更新されて食い違う ── これは移行前より悪い状態です。必ず参照にしてください。
5. 結果が違ったとき
移行してみると、新旧で結果が違うことがあります。よくある原因を並べます。
| 原因 | 確認方法 |
|---|---|
| 除外条件の違い | キャンセル・返品・テストデータの扱い |
| 期間の定義 | 締め日、タイムゾーン |
| 税や手数料の扱い | 含むか含まないか |
| 重複の扱い | 同一人物の数え方 |
| アクセス制御 | 見えている範囲が違う(EP.15) |
最下行を忘れないでください。制御が入っていると、実行する人によって結果が違います。EP.15 で扱ったとおり、これは調査を難航させる原因です。同じ権限で比較してください。
そして重要なのは、違いが見つかったときに「新しいほうが正しい」と決めつけないことです。旧の定義に、書かれていない業務上の理由があるかもしれません。必ず事業側に確認してください。
6. 移行後に保つ
移行しても、放っておけばまた散らばります。新しい定義を各所で作られないための仕組みが要ります。
- 新しい指標は、セマンティック層に追加する — 手順として決める
- BIツールでの計算式の追加を制限する — 可能なら
- 定期的に、新しい定義が生まれていないか確認 — 棚卸し
- 追加が面倒だと散らばる — 手続きを軽くする
4番目が最も実務的です。セマンティック層への追加が面倒だと、人は手元で計算します。承認に何日もかかる仕組みにすると、確実に迂回されます。
データ屋の道具箱 EP.22 でも書きましたが、維持できない仕組みは迂回されます。厳密さより、続けられる軽さを優先してください。
完全な洗い出しは不可能なので、主要な場所から始めて順次取り込む。食い違いを数字で示すと議論が進む(同じ「売上」で4つの値が出る)。並行期間は定義を複製せず、旧から新を参照する形にする。結果が違ったら「新しいほうが正しい」と決めつけず、事業側に確認する。そして追加の手続きが重いと迂回されるので、軽く保ってください。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。