0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

粒度違いの計測データを安全に扱う UNION VIEW ベストプラクティス

Last updated at Posted at 2025-12-22

はじめに

計測データを扱うシステムでは、
次のような構成になることがよくあります。

  • 5分ごとの生データ
  • 1時間ごとの集計データ
  • データソース都合で分かれた複数テーブル

これらをアプリケーションから扱うとき、

「同じ形式として扱いたい」

と考えるのは自然です。

その際によく出てくる選択肢が VIEW + UNION です。

本記事では、

  • UNION を使う設計が 良いケース
  • アンチパターン になるケース
  • 設計時の判断軸

を、計測データを例に整理します。


想定する前提

  • 計測データを保持するテーブルが複数ある
  • カラム構成はほぼ同じ
  • 違いは以下のいずれか
    • 粒度が異なる(例えば、5分 / 1時間)
    • 生データ / 集計済み
    • データソースの違い
  • アプリケーションからは「同じ形式」で参照したい

結論

参照・集計用途であれば、VIEW + UNION は筋が良い

ただし、

「同じ形」ではなく「同じ意味で扱って安全か」

を満たしていないと、簡単にアンチパターンになります。


良い例:Read Model としての UNION VIEW

実体テーブル

measurement_5min
----------------------
timestamp
value

measurement_hourly
----------------------
timestamp
value

VIEW

CREATE VIEW v_measurements AS
SELECT
  timestamp,
  value,
  5  AS interval_minutes,
  'raw' AS aggregation_type
FROM measurement_5min

UNION ALL

SELECT
  timestamp,
  value,
  60 AS interval_minutes,
  'hourly_avg' AS aggregation_type
FROM measurement_hourly;

ポイント

  • 粒度・集計状態を 列として明示
  • 実体テーブルの差異を VIEW に閉じ込めている
  • VIEW は 参照専用(Read Model)

アンチパターン①:意味が違う値を同列で UNION

❌ 問題のある設計

measurement_5min
----------------------
timestamp
temperature  -- 実測値

measurement_hourly
----------------------
timestamp
temperature  -- 1時間平均
CREATE VIEW v_measurements AS
SELECT timestamp, temperature FROM measurement_5min
UNION ALL
SELECT timestamp, temperature FROM measurement_hourly;

何が問題か

  • 列名は同じだが 意味が違う
  • 利用者が区別できない
SELECT AVG(temperature) FROM v_measurements;

👉 生データと平均値が混ざった 意味不明な集計 が生まれる


アンチパターン②:粒度情報を持たせていない

CREATE VIEW v_measurements AS
SELECT timestamp, value FROM measurement_5min
UNION ALL
SELECT timestamp, value FROM measurement_hourly;

問題点

  • timestamp = 10:00 が何を意味するか分からない
  • 時系列分析で歪みが発生

👉 時間軸を信用できない VIEW になる


アンチパターン③:書き込み対象にしようとする

INSERT INTO v_measurements (...)

問題点

  • どの実体テーブルに入るか決まらない
  • トリガー依存・実装不能

👉 UNION VIEW は Write Model にしてはいけない


アンチパターン④:万能 VIEW を作ろうとする

v_measurements_all =
  5分 + 1時間 + 日次 + 月次

問題点

  • 将来の拡張で肥大化
  • パフォーマンス劣化
  • 影響範囲が読めない

👉 用途別 VIEW が基本


設計時のチェックリスト

UNION VIEW を作る前に、次を確認します。

  • UNION した結果をそのまま集計しても意味が破綻しないか
  • 粒度・集計状態が列として表現されているか
  • VIEW は参照専用になっているか
  • 将来の粒度追加を想定しているか

1つでも怪しければ、設計を見直した方が安全です。


まとめ

  • UNION + VIEW は 論理モデルの統合手段
  • 「便利だからまとめる」は危険
  • 意味・粒度・用途を明示することが最重要

UNION する基準は「同じ形」ではなく「同じ意味」

計測データ設計では特に、この意識がないと事故ります。


おわりに

本記事では UNION を中心に整理しましたが、

  • 縦持ち / 横持ち
  • Read Model / Write Model
  • 集計データの扱い方

とも強く関係します。

これらを分けて考えると、データ設計で迷うことが一気に減ります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?