コンテンツにスキップ
テーブルの種類:詳細ガイド

テーブルの種類:詳細ガイド

4 種類のテーブルを、選択基準、性能、実例で比較します。

4 種類のテーブル

それぞれ異なる負荷に最適化されています。

  1. Tag:時刻または距離を軸とするセンサーデータ
  2. Log:イベントとログ
  3. Volatile:インメモリのリアルタイムデータ
  4. Lookup:参照データとマスター

選択の早見ガイド

選択の開始

次の条件から選択します。

┌─────────────────────────────────────────────────┐
│ どの種類のデータですか?                        │
└─────────────────────────────────────────────────┘
                      │
        ┌─────────────┴─────────────┐
        │                           │
    永続保存?                 一時保存?
        │                           │
        ▼                           ▼
    ┌───────┐                 ┌──────────┐
    │ はい  │                 │ Volatile │
    └───┬───┘                 │  テーブル│
        │                     └──────────┘
        ▼
    センサー/測定データ
    (ID、軸、値)?
        │
    ┌───┴────┐
    │        │
   はい      いいえ
    │        │
    ▼        ▼
  Tag     ログ/イベント
  テーブル    データ?
            │
        ┌───┴────┐
        │        │
       はい      いいえ
        │        │
        ▼        ▼
      Log     Lookup
      テーブル    テーブル

選択表

データ推奨理由
1000 台の温度センサーTag複数センサーの時系列値
アプリケーションのエラーログLogイベントと柔軟なスキーマ
現在のユーザーセッションVolatile更新が必要な一時データ
デバイス情報、台帳Lookup更新の少ない参照データ
株式ティックTag銘柄がタグ、価格が値
位置ごとのコンベヤー振動Tag距離軸の測定
HTTP アクセスログLog多数の列を持つイベント
ショッピングカートVolatileセッション単位の頻繁な更新
商品カタログLookup変更の少ないマスター

Tag テーブル

適した用途

主な用途:

  • 温度、湿度、圧力などの IoT
  • 産業機器のテレメトリー
  • スマートメーター
  • GPS 追跡
  • 走行距離、コンベヤー長、レール位置などの距離軸データ
  • (sensor_id, time|distance, value) 形式のデータ

構造

-- 時間軸
CREATE TAG TABLE sensors (
    sensor_id VARCHAR(20) PRIMARY KEY,    -- タグ名(センサー識別子)
    time DATETIME BASETIME,               -- タイムスタンプ
    value DOUBLE SUMMARIZED,              -- ロールアップ対象値
    other_value DOUBLE                    -- 追加の測定値
) WITH ROLLUP;

-- 距離軸
CREATE TAG TABLE conveyor_profile (
    line_id VARCHAR(20) PRIMARY KEY,
    distance_m DOUBLE BASE DISTANCE,
    vibration DOUBLE,
    temperature DOUBLE
);

主な機能

ロールアップ統計(時間軸のみ):

-- 元データ
INSERT INTO sensors (sensor_id, time, value) VALUES ('sensor01', NOW, 25.3);

-- ロールアップ式による時間単位の統計
SELECT rollup('hour', 1, time) AS hour_time, AVG(value), COUNT(value)
FROM sensors
GROUP BY hour_time;

WITH ROLLUP または CREATE ROLLUP で定義してから、 ロールアップ式を使用します。距離軸では、範囲検索とバケット集計を 使用します。

メタデータ層:

-- センサーメタデータ用の別テーブル
SELECT * FROM sensors METADATA;

-- 独自のメタデータ列を追加
ALTER TABLE sensors METADATA ADD COLUMN (location VARCHAR(100));
UPDATE sensors METADATA SET location = 'Building A' WHERE name = 'sensor01';

性能:

  • 毎秒数百万件の挿入
  • タグと軸の範囲による高速検索
  • 自動の 3 階層パーティションインデックス

推奨事項

推奨する使い方:

  • 数千のセンサーを 1 つのテーブルに保存
  • 集計対象に SUMMARIZED を指定
  • 時間軸の統計にはロールアップを検索
  • センサー情報をメタデータに保存

避ける使い方:

  • センサーごとにテーブルを分割
  • データ値の UPDATE(メタデータの更新は可能)
  • センサー以外の形式に無理に適用

使用例

-- 製造業:機器センサー
CREATE TAG TABLE equipment_telemetry (
    equipment_id VARCHAR(50) PRIMARY KEY,
    time DATETIME BASETIME,
    temperature DOUBLE SUMMARIZED,
    vibration DOUBLE,
    rpm DOUBLE,
    power_consumption DOUBLE
);

-- スマートシティ:環境監視
CREATE TAG TABLE air_quality (
    station_id VARCHAR(30) PRIMARY KEY,
    time DATETIME BASETIME,
    pm25 DOUBLE SUMMARIZED,
    pm10 DOUBLE,
    co2 DOUBLE,
    temperature DOUBLE
);

-- 距離軸:コンベヤーや経路のプロファイル
CREATE TAG TABLE route_profile (
    route_id VARCHAR(30) PRIMARY KEY,
    distance_m DOUBLE BASE DISTANCE,
    vibration DOUBLE,
    temperature DOUBLE
);

Log テーブル

適した用途

主な用途:

  • アプリケーションログ
  • イベントストリーム
  • アクセスログ
  • トランザクションログ
  • 可変スキーマのタイムスタンプ付きイベント

構造

CREATE TABLE app_logs (
    level VARCHAR(10),
    component VARCHAR(50),
    message VARCHAR(2000),
    user_id INTEGER,
    ip_addr IPV4
    -- _arrival_time は自動追加
);

主な機能

自動タイムスタンプ:

-- 入力する内容
INSERT INTO app_logs VALUES ('ERROR', 'DB', 'Connection timeout', 123, '192.168.1.1');

-- ナノ秒タイムスタンプ付きで保存
-- _arrival_time: 2025-10-10 14:23:45.123456789

全文検索:

-- SEARCH の前にキーワードインデックスを作成
CREATE INDEX idx_app_logs_message ON app_logs(message) INDEX_TYPE KEYWORD;

-- 高速なテキスト検索
SELECT * FROM app_logs
WHERE message SEARCH 'timeout'
  AND level = 'ERROR';

柔軟なスキーマ:

  • 必要に応じた列構成
  • 対応する各データ型
  • 固定パターンが不要

性能:

  • 毎秒数百万件の挿入
  • 最新から取得(自動的な順序)
  • 必要に応じて LSM を作成

推奨事項

推奨する使い方:

  • 可変形式のイベント
  • SEARCH によるテキスト検索
  • DURATION による時刻検索
  • 保持ポリシーを設定

避ける使い方:

  • センサーデータ(Tag を使用)
  • 参照データ(Lookup を使用)
  • キーによる UPDATE/DELETE を想定

使用例

-- アプリケーション監視
CREATE TABLE application_events (
    app_name VARCHAR(50),
    event_type VARCHAR(50),
    severity VARCHAR(20),
    message VARCHAR(2000),
    user_id INTEGER,
    session_id VARCHAR(100),
    stack_trace VARCHAR(4000)
);

-- Web サーバーのアクセスログ
CREATE TABLE http_access (
    method VARCHAR(10),
    uri VARCHAR(1000),
    status_code INTEGER,
    response_time INTEGER,
    client_ip IPV4,
    user_agent VARCHAR(500),
    referer VARCHAR(500)
);

-- 金融取引
CREATE TABLE transactions (
    transaction_id VARCHAR(50),
    account_id INTEGER,
    transaction_type VARCHAR(30),
    amount DOUBLE,
    currency VARCHAR(3),
    status VARCHAR(20),
    description VARCHAR(500)
);

Volatile テーブル

適した用途

主な用途:

  • リアルタイムダッシュボード
  • セッション管理
  • 状態表示
  • キャッシュ層
  • UPDATE/DELETE が必要なデータ

構造

CREATE VOLATILE TABLE live_status (
    device_id INTEGER PRIMARY KEY,    -- 更新には PRIMARY KEY が必要
    status VARCHAR(20),
    last_value DOUBLE,
    last_updated DATETIME
);

主な機能

キーによる UPDATE と DELETE:

-- 既存レコードを更新
UPDATE live_status
SET status = 'RUNNING', last_value = 25.3, last_updated = NOW
WHERE device_id = 101;

-- 指定レコードを削除
DELETE FROM live_status WHERE device_id = 101;

インメモリ:

  • 全データを RAM に保存
  • 高速な読み書き
  • 毎秒数万回の操作

警告:永続保存されない

  • 再起動時にデータを喪失
  • 停止前に重要なデータを退避

推奨事項

推奨する使い方:

  • PRIMARY KEY で高速検索
  • RAM に収まる小さなデータ量
  • Log/Tag へ定期退避
  • 現在の状態の管理

避ける使い方:

  • 永続保存が必要なデータ
  • 大量のストリーミングデータ
  • 再起動後もデータが残る想定

使用例

-- 機器のリアルタイム状態
CREATE VOLATILE TABLE equipment_status (
    equipment_id INTEGER PRIMARY KEY,
    online CHAR(1),
    current_temp DOUBLE,
    current_pressure DOUBLE,
    last_heartbeat DATETIME
);

-- 有効なユーザーセッション
CREATE VOLATILE TABLE user_sessions (
    session_token VARCHAR(100) PRIMARY KEY,
    user_id INTEGER,
    ip_address IPV4,
    login_time DATETIME,
    last_activity DATETIME,
    expires_at DATETIME
);

-- リアルタイム監視のキャッシュ
CREATE VOLATILE TABLE monitoring_cache (
    metric_key VARCHAR(100) PRIMARY KEY,
    metric_value VARCHAR(500),
    updated_at DATETIME
);

Lookup テーブル

適した用途

主な用途:

  • デバイス台帳
  • 設定テーブル
  • カテゴリーとディメンション
  • マスターデータ
  • 変更頻度の低い参照データ

構造

CREATE LOOKUP TABLE devices (
    device_id VARCHAR(20) PRIMARY KEY,
    device_name VARCHAR(100),
    location VARCHAR(200),
    device_type VARCHAR(50),
    owner VARCHAR(100)
);

主な機能

すべての CRUD:

-- 挿入
INSERT INTO devices VALUES ('sensor01', 'Sensor A', 'Building 1', 'Temperature', 'Facilities');

-- 更新
UPDATE devices SET location = 'Building 2' WHERE device_id = 'sensor01';

-- 削除
DELETE FROM devices WHERE device_id = 'sensor01';

-- 検索
SELECT * FROM devices WHERE device_type = 'Temperature';

時系列との JOIN:

-- センサーデータにデバイス情報を付加
SELECT s.*, d.device_name, d.location
FROM sensors s
JOIN devices d ON s.sensor_id = d.device_id
WHERE s.time BETWEEN TO_DATE('2025-10-10 14:00:00', 'YYYY-MM-DD HH24:MI:SS')
                 AND TO_DATE('2025-10-10 15:00:00', 'YYYY-MM-DD HH24:MI:SS');

性能:

  • 高速な読み取り
  • 低速な書き込み(毎秒数百件)
  • ディスクへの永続保存

推奨事項

推奨する使い方:

  • 参照データとマスター
  • Tag/Log との結合
  • 頻用する検索列のインデックス
  • 適切なデータ量(100 万行未満が目安)

避ける使い方:

  • 高頻度の挿入
  • 時系列データの保存
  • 毎秒数百万件の書き込みを想定

使用例

-- デバイス台帳
CREATE LOOKUP TABLE device_registry (
    device_id VARCHAR(50) PRIMARY KEY,
    device_name VARCHAR(100),
    device_type VARCHAR(50),
    location VARCHAR(200),
    installation_date DATETIME,
    status VARCHAR(20)
);

-- 設定管理
CREATE LOOKUP TABLE system_config (
    config_key VARCHAR(100) PRIMARY KEY,
    config_value VARCHAR(500),
    config_category VARCHAR(50),
    description VARCHAR(500)
);

-- ユーザー管理
CREATE LOOKUP TABLE users (
    user_id INTEGER PRIMARY KEY,
    username VARCHAR(100),
    email VARCHAR(200),
    role VARCHAR(50),
    created_at DATETIME
);

性能比較

書き込み性能

毎秒の挿入UPDATEDELETE
Tag数百万メタデータのみ時刻条件
Log数百万不可時刻条件
Volatile数万主キー主キー
Lookup数百

読み取り性能

速度得意な条件インデックス
Tag非常に高速sensor_id と時刻3 階層パーティション
Log高速時刻範囲LSM(任意)
Volatile非常に高速主キーRED-BLACK ツリー
Lookup高速任意の列RED-BLACK(追加は任意)

ストレージ

保存先圧縮率永続性
Tagディスク10~100 倍あり
Logディスク10~100 倍あり
Volatileメモリなしなし
Lookupディスク中程度あり

型の組み合わせ

IoT プラットフォーム

-- Tag:センサー測定値
CREATE TAG TABLE sensor_data (...);

-- Lookup:デバイス台帳
CREATE LOOKUP TABLE devices (...);

-- Volatile:現在の状態
CREATE VOLATILE TABLE device_status (...);

-- Log:イベントとアラート
CREATE TABLE device_events (...);

Web アプリケーション

-- Log:アクセスログ
CREATE TABLE http_access (...);

-- Log:アプリケーションログ
CREATE TABLE app_logs (...);

-- Volatile:有効なセッション
CREATE VOLATILE TABLE sessions (...);

-- Lookup:ユーザーアカウント
CREATE LOOKUP TABLE users (...);

製造業

-- Tag:機器センサー
CREATE TAG TABLE equipment_telemetry (...);

-- Log:生産イベント
CREATE TABLE production_log (...);

-- Volatile:生産ラインの状態
CREATE VOLATILE TABLE line_status (...);

-- Lookup:機器カタログ
CREATE LOOKUP TABLE equipment_catalog (...);

避けるべきパターン

1.用途に合わない型

避ける例:センサーに Log を使用

-- この設計は避ける
CREATE TABLE sensors (sensor_id VARCHAR(20), value DOUBLE);

推奨:Tag を使用

CREATE TAG TABLE sensors (
    sensor_id VARCHAR(20) PRIMARY KEY,
    time DATETIME BASETIME,
    value DOUBLE SUMMARIZED
);

2.センサーごとのテーブル

避ける例:1000 センサーに 1000 テーブル

CREATE TAG TABLE sensor001 (...);
CREATE TAG TABLE sensor002 (...);
-- ほかに 998 テーブル

推奨:1 テーブルにまとめる

CREATE TAG TABLE all_sensors (
    sensor_id VARCHAR(20) PRIMARY KEY,
    ...
);

3.Volatile に履歴を保存

避ける例:永続データを Volatile に保存

-- 再起動するとデータは失われる
CREATE VOLATILE TABLE important_transactions (...);

推奨:Log または Tag

CREATE TABLE important_transactions (...);

4.Lookup への高頻度書き込み

避ける例:毎秒数百万件を Lookup へ入力

-- 入力が遅くなる
CREATE LOOKUP TABLE sensor_readings (...);

推奨:Tag または Log

CREATE TAG TABLE sensor_readings (...);

移行ガイド

他のデータベースからの移行

PostgreSQL/MySQL:

  • 通常のテーブル → Log
  • 時系列テーブル → Tag
  • 一時テーブル → Volatile
  • ディメンション → Lookup

InfluxDB:

  • Measurement → Tag テーブル
  • Tag → タグの主キーとメタデータ
  • Field → SUMMARIZED の値列と通常の追加値列

MongoDB:

  • 時系列コレクション → Tag/Log
  • 参照コレクション → Lookup
  • Capped collection → 保持期間を設定した Log

一覧

機能TagLogVolatileLookup
主用途センサーイベントキャッシュ参照
スキーマ固定パターン柔軟柔軟柔軟
毎秒の書き込み数百万数百万数万数百
UPDATEメタデータ不可
DELETE時刻条件時刻条件キーキー
保存先ディスクディスクメモリディスク
永続性ありありなしあり
ロールアップ設定時に利用なしなしなし
得意な検索ID と時刻時刻キー任意
圧縮非常に高い高いなし中程度

次のステップ

要点

  1. センサーにはロールアップを持つ Tag
  2. 柔軟なイベントとログには Log
  3. メモリ内で更新するデータには Volatile
  4. 参照データとマスターには Lookup
  5. 複数の型を組み合わせて構成
  6. 型の選択が性能を左右する

適切なテーブルを選び、効率のよいアプリケーションを設計してください。

最終更新日