Redash8.0のMetadata

## ER図

[一覧](https://dbdiagram.io/d/67087e6197a66db9a39b578a)

## データベーステーブルの概要

### テーブル一覧

* **access_permissions**: アクセス権の管理テーブル。オブジェクトタイプ、オブジェクトID、アクセス権種別、付与者ID、受取者IDなどを管理。
* **alembic_version**: マイグレーションのバージョン管理テーブル。
* **alert_subscriptions**: アラートの購読情報を管理。アラートID、ユーザーID、通知先IDなど。
* **alerts**: アラートの設定を管理。アラート名、クエリID、ユーザーID、状態、リトリガー設定など。
* **api_keys**: APIキーの管理。オブジェクトタイプ、オブジェクトID、APIキー、組織IDなど。
* **changes**: 変更履歴を管理。変更内容、ユーザーID、オブジェクトタイプ、オブジェクトIDなど。
* **dashboards**: ダッシュボードの情報を管理。名前、スラッグ、バージョン、フィルター機能の有無、アーカイブフラグなど。
* **data_source_groups**: データソースとグループの関連付けを管理。データソースID、グループID、閲覧専用かどうかを記録。
* **data_sources**: データソースの設定を管理。名前、タイプ、オプション、作成日など。
* **events**: イベントのログ。アクション、オブジェクトタイプ、ユーザーID、作成日など。
* **favorites**: お気に入り機能の管理。オブジェクトタイプ、オブジェクトID、ユーザーIDなど。
* **groups**: グループの情報を管理。名前、タイプ、権限など。
* **notification_destinations**: 通知先の情報を管理。名前、タイプ、オプションなど。
* **organizations**: 組織の情報を管理。名前、スラッグ、設定など。
* **queries**: クエリの情報を管理。名前、説明、クエリ内容、APIキー、スケジュールなど。
* **query_results**: クエリの実行結果を保存。データ、実行時間、取得日時など。
* **query_snippets**: クエリのスニペット（共通コード）。トリガー、スニペット内容など。
* **users**: ユーザー情報を管理。名前、メールアドレス、グループ、APIキーなど。
* **visualizations**: 可視化（グラフなど）の設定を管理。名前、タイプ、オプションなど。
* **widgets**: ウィジェット（ダッシュボード上のコンポーネント）。ダッシュボードID、幅、オプションなど。

各テーブルには、主キーや外部キーが設定され、データの一貫性が保たれています。また、特定の条件でユニークなインデックスが作られています。

## テーブル詳細

### access_permissions

**説明**: アクセス権の管理テーブル。

**カラム**:

* `object_type` (character varying(255), **NOT NULL**)
* `object_id` (integer, **NOT NULL**)
* `id` (integer, **NOT NULL**, デフォルト: `nextval('access_permissions_id_seq'::regclass)`)
* `access_type` (character varying(255), **NOT NULL**)
* `grantor_id` (integer, **NOT NULL**)
* `grantee_id` (integer, **NOT NULL**)

**インデックス**:

* `access_permissions_pkey` PRIMARY KEY, btree (`id`)

**外部キー制約**:

* `grantor_id` → `users(id)`
* `grantee_id` → `users(id)`

### alembic_version

**説明**: マイグレーションのバージョン管理テーブル。

**カラム**:

* `version_num` (character varying(32), **NOT NULL**)

**インデックス**:

* `alembic_version_pkc` PRIMARY KEY, btree (`version_num`)

### alert_subscriptions

**説明**: アラートの購読情報を管理。

**カラム**:

* `updated_at` (timestamp with time zone, **NOT NULL**)
* `created_at` (timestamp with time zone, **NOT NULL**)
* `id` (integer, **NOT NULL**, デフォルト: `nextval('alert_subscriptions_id_seq'::regclass)`)
* `user_id` (integer, **NOT NULL**)
* `destination_id` (integer)
* `alert_id` (integer, **NOT NULL**)

**インデックス**:

* `alert_subscriptions_pkey` PRIMARY KEY, btree (`id`)
* `alert_subscriptions_destination_id_alert_id` UNIQUE, btree (`destination_id`, `alert_id`)

**外部キー制約**:

* `alert_id` → `alerts(id)`
* `destination_id` → `notification_destinations(id)`
* `user_id` → `users(id)`

### alerts

**説明**: アラートの設定を管理。

**カラム**:

* `updated_at` (timestamp with time zone, **NOT NULL**)
* `created_at` (timestamp with time zone, **NOT NULL**)
* `id` (integer, **NOT NULL**, デフォルト: `nextval('alerts_id_seq'::regclass)`)
* `name` (character varying(255), **NOT NULL**)
* `query_id` (integer, **NOT NULL**)
* `user_id` (integer, **NOT NULL**)
* `options` (text, **NOT NULL**)
* `state` (character varying(255), **NOT NULL**)
* `last_triggered_at` (timestamp with time zone)
* `rearm` (integer)

**インデックス**:

* `alerts_pkey` PRIMARY KEY, btree (`id`)

**外部キー制約**:

* `query_id` → `queries(id)`
* `user_id` → `users(id)`

### api_keys

**説明**: APIキーの管理。

**カラム**:

* `object_type` (character varying(255), **NOT NULL**)
* `object_id` (integer, **NOT NULL**)
* `updated_at` (timestamp with time zone, **NOT NULL**)
* `created_at` (timestamp with time zone, **NOT NULL**)
* `id` (integer, **NOT NULL**, デフォルト: `nextval('api_keys_id_seq'::regclass)`)
* `org_id` (integer, **NOT NULL**)
* `api_key` (character varying(255), **NOT NULL**)
* `active` (boolean, **NOT NULL**)
* `created_by_id` (integer)

**インデックス**:

* `api_keys_pkey` PRIMARY KEY, btree (`id`)
* `api_keys_object_type_object_id` btree (`object_type`, `object_id`)
* `ix_api_keys_api_key` btree (`api_key`)

**外部キー制約**:

* `created_by_id` → `users(id)`
* `org_id` → `organizations(id)`

### changes

**説明**: 変更履歴を管理。

**カラム**:

* `object_type` (character varying(255), **NOT NULL**)
* `object_id` (integer, **NOT NULL**)
* `id` (integer, **NOT NULL**, デフォルト: `nextval('changes_id_seq'::regclass)`)
* `object_version` (integer, **NOT NULL**)
* `user_id` (integer, **NOT NULL**)
* `change` (text, **NOT NULL**)
* `created_at` (timestamp with time zone, **NOT NULL**)

**インデックス**:

* `changes_pkey` PRIMARY KEY, btree (`id`)

**外部キー制約**:

* `user_id` → `users(id)`

### dashboards

**説明**: ダッシュボードの情報を管理。

**カラム**:

* `updated_at` (timestamp with time zone, **NOT NULL**)
* `created_at` (timestamp with time zone, **NOT NULL**)
* `id` (integer, **NOT NULL**, デフォルト: `nextval('dashboards_id_seq'::regclass)`)
* `version` (integer, **NOT NULL**)
* `org_id` (integer, **NOT NULL**)
* `slug` (character varying(140), **NOT NULL**)
* `name` (character varying(100), **NOT NULL**)
* `user_id` (integer, **NOT NULL**)
* `layout` (text, **NOT NULL**)
* `dashboard_filters_enabled` (boolean, **NOT NULL**)
* `is_archived` (boolean, **NOT NULL**)
* `is_draft` (boolean, **NOT NULL**)
* `tags` (character varying\[\])

**インデックス**:

* `dashboards_pkey` PRIMARY KEY, btree (`id`)
* `ix_dashboards_is_archived` btree (`is_archived`)
* `ix_dashboards_is_draft` btree (`is_draft`)
* `ix_dashboards_slug` btree (`slug`)

**外部キー制約**:

* `org_id` → `organizations(id)`
* `user_id` → `users(id)`

### data_source_groups

**説明**: データソースとグループの関連付けを管理。

**カラム**:

* `id` (integer, **NOT NULL**, デフォルト: `nextval('data_source_groups_id_seq'::regclass)`)
* `data_source_id` (integer, **NOT NULL**)
* `group_id` (integer, **NOT NULL**)
* `view_only` (boolean, **NOT NULL**)

**インデックス**:

* `data_source_groups_pkey` PRIMARY KEY, btree (`id`)

**外部キー制約**:

* `data_source_id` → `data_sources(id)`
* `group_id` → `groups(id)`

### data_sources

**説明**: データソースの設定を管理。

**カラム**:

* `id` (integer, **NOT NULL**, デフォルト: `nextval('data_sources_id_seq'::regclass)`)
* `org_id` (integer, **NOT NULL**)
* `name` (character varying(255), **NOT NULL**)
* `type` (character varying(255), **NOT NULL**)
* `encrypted_options` (bytea, **NOT NULL**)
* `queue_name` (character varying(255), **NOT NULL**)
* `scheduled_queue_name` (character varying(255), **NOT NULL**)
* `created_at` (timestamp with time zone, **NOT NULL**)

**インデックス**:

* `data_sources_pkey` PRIMARY KEY, btree (`id`)
* `data_sources_org_id_name` btree (`org_id`, `name`)

**外部キー制約**:

* `org_id` → `organizations(id)`

### events

**説明**: イベントのログを管理。

**カラム**:

* `id` (integer, **NOT NULL**, デフォルト: `nextval('events_id_seq'::regclass)`)
* `org_id` (integer, **NOT NULL**)
* `user_id` (integer)
* `action` (character varying(255), **NOT NULL**)（login、load_favorites、view、list、create、test、edit、view_source、execute_query、execute、update、edit_name、toggle_published）
* `object_type` (character varying(255), **NOT NULL**)　（redash、query、dashboard、page、datasource、query_snippet、data_source、visualization、widget、group、user、settings）
* `object_id` (character varying(255))
* `additional_properties` (text)
* `created_at` (timestamp with time zone, **NOT NULL**)

**インデックス**:

* `events_pkey` PRIMARY KEY, btree (`id`)

**外部キー制約**:

* `org_id` → `organizations(id)`
* `user_id` → `users(id)`

### favorites

**説明**: お気に入り機能の管理。

**カラム**:

* `updated_at` (timestamp with time zone, **NOT NULL**)
* `created_at` (timestamp with time zone, **NOT NULL**)
* `id` (integer, **NOT NULL**, デフォルト: `nextval('favorites_id_seq'::regclass)`)
* `org_id` (integer, **NOT NULL**)
* `object_type` (character varying(255), **NOT NULL**)
* `object_id` (integer, **NOT NULL**)
* `user_id` (integer, **NOT NULL**)

**インデックス**:

* `favorites_pkey` PRIMARY KEY, btree (`id`)
* `unique_favorite` UNIQUE CONSTRAINT, btree (`object_type`, `object_id`, `user_id`)

**外部キー制約**:

* `org_id` → `organizations(id)`
* `user_id` → `users(id)`

### groups

**説明**: グループの情報を管理。

**カラム**:

* `id` (integer, **NOT NULL**, デフォルト: `nextval('groups_id_seq'::regclass)`)
* `org_id` (integer, **NOT NULL**)
* `type` (character varying(255), **NOT NULL**)
* `name` (character varying(100), **NOT NULL**)
* `permissions` (character varying(255)\[\], **NOT NULL**)
* `created_at` (timestamp with time zone, **NOT NULL**)

**インデックス**:

* `groups_pkey` PRIMARY KEY, btree (`id`)

**外部キー制約**:

* `org_id` → `organizations(id)`

### notification_destinations

**説明**: 通知先の情報を管理。

**カラム**:

* `id` (integer, **NOT NULL**, デフォルト: `nextval('notification_destinations_id_seq'::regclass)`)
* `org_id` (integer, **NOT NULL**)
* `user_id` (integer, **NOT NULL**)
* `name` (character varying(255), **NOT NULL**)
* `type` (character varying(255), **NOT NULL**)
* `options` (text, **NOT NULL**)
* `created_at` (timestamp with time zone, **NOT NULL**)

**インデックス**:

* `notification_destinations_pkey` PRIMARY KEY, btree (`id`)
* `notification_destinations_org_id_name` UNIQUE, btree (`org_id`, `name`)

**外部キー制約**:

* `org_id` → `organizations(id)`
* `user_id` → `users(id)`

### organizations

**説明**: 組織の情報を管理。

**カラム**:

* `updated_at` (timestamp with time zone, **NOT NULL**)
* `created_at` (timestamp with time zone, **NOT NULL**)
* `id` (integer, **NOT NULL**, デフォルト: `nextval('organizations_id_seq'::regclass)`)
* `name` (character varying(255), **NOT NULL**)
* `slug` (character varying(255), **NOT NULL**)
* `settings` (text, **NOT NULL**)

**インデックス**:

* `organizations_pkey` PRIMARY KEY, btree (`id`)
* `organizations_slug_key` UNIQUE CONSTRAINT, btree (`slug`)

### queries

**説明**: クエリの情報を管理。

**カラム**:

* `updated_at` (timestamp with time zone, **NOT NULL**)
* `created_at` (timestamp with time zone, **NOT NULL**)
* `id` (integer, **NOT NULL**, デフォルト: `nextval('queries_id_seq'::regclass)`)
* `version` (integer, **NOT NULL**)
* `org_id` (integer, **NOT NULL**)
* `data_source_id` (integer)
* `latest_query_data_id` (integer)
* `name` (character varying(255), **NOT NULL**)
* `description` (character varying(4096))
* `query` (text, **NOT NULL**)
* `query_hash` (character varying(32), **NOT NULL**)
* `api_key` (character varying(40), **NOT NULL**)
* `user_id` (integer, **NOT NULL**)
* `last_modified_by_id` (integer)
* `is_archived` (boolean, **NOT NULL**)
* `is_draft` (boolean, **NOT NULL**)
* `schedule` (text)
* `schedule_failures` (integer, **NOT NULL**)
* `options` (text, **NOT NULL**)
* `search_vector` (tsvector)
* `tags` (character varying\[\])

**インデックス**:

* `queries_pkey` PRIMARY KEY, btree (`id`)
* `ix_queries_is_archived` btree (`is_archived`)
* `ix_queries_is_draft` btree (`is_draft`)
* `ix_queries_search_vector` gin (`search_vector`)

**外部キー制約**:

* `data_source_id` → `data_sources(id)`
* `latest_query_data_id` → `query_results(id)`
* `org_id` → `organizations(id)`
* `user_id` → `users(id)`
* `last_modified_by_id` → `users(id)`

### query_results

**説明**: クエリの実行結果を保存。

**カラム**:

* `id` (integer, **NOT NULL**, デフォルト: `nextval('query_results_id_seq'::regclass)`)
* `org_id` (integer, **NOT NULL**)
* `data_source_id` (integer, **NOT NULL**)
* `query_hash` (character varying(32), **NOT NULL**)
* `query` (text, **NOT NULL**)
* `data` (text, **NOT NULL**)
* `runtime` (double precision, **NOT NULL**)
* `retrieved_at` (timestamp with time zone, **NOT NULL**)

**インデックス**:

* `query_results_pkey` PRIMARY KEY, btree (`id`)
* `ix_query_results_query_hash` btree (`query_hash`)

**外部キー制約**:

* `data_source_id` → `data_sources(id)`
* `org_id` → `organizations(id)`

### query_snippets

**説明**: クエリのスニペット（共通コード）。

**カラム**:

* `updated_at` (timestamp with time zone, **NOT NULL**)
* `created_at` (timestamp with time zone, **NOT NULL**)
* `id` (integer, **NOT NULL**, デフォルト: `nextval('query_snippets_id_seq'::regclass)`)
* `org_id` (integer, **NOT NULL**)
* `trigger` (character varying(255), **NOT NULL**)
* `description` (text, **NOT NULL**)
* `user_id` (integer, **NOT NULL**)
* `snippet` (text, **NOT NULL**)

**インデックス**:

* `query_snippets_pkey` PRIMARY KEY, btree (`id`)
* `query_snippets_trigger_key` UNIQUE CONSTRAINT, btree (`trigger`)

**外部キー制約**:

* `org_id` → `organizations(id)`
* `user_id` → `users(id)`

### users

**説明**: ユーザー情報を管理。

**カラム**:

* `updated_at` (timestamp with time zone, **NOT NULL**)
* `created_at` (timestamp with time zone, **NOT NULL**)
* `id` (integer, **NOT NULL**, デフォルト: `nextval('users_id_seq'::regclass)`)
* `org_id` (integer, **NOT NULL**)
* `name` (character varying(320), **NOT NULL**)
* `email` (character varying(255), **NOT NULL**)
* `profile_image_url` (character varying(320))
* `password_hash` (character varying(128))
* `groups` (integer\[\])
* `api_key` (character varying(40), **NOT NULL**)
* `disabled_at` (timestamp with time zone)
* `details` (json, デフォルト: `'{}'::json`)

**インデックス**:

* `users_pkey` PRIMARY KEY, btree (`id`)
* `users_api_key_key` UNIQUE CONSTRAINT, btree (`api_key`)
* `users_org_id_email` UNIQUE, btree (`org_id`, `email`)

**外部キー制約**:

* `org_id` → `organizations(id)`

### visualizations

**説明**: 可視化（グラフなど）の設定を管理。

**カラム**:

* `updated_at` (timestamp with time zone, **NOT NULL**)
* `created_at` (timestamp with time zone, **NOT NULL**)
* `id` (integer, **NOT NULL**, デフォルト: `nextval('visualizations_id_seq'::regclass)`)
* `type` (character varying(100), **NOT NULL**)
* `query_id` (integer, **NOT NULL**)
* `name` (character varying(255), **NOT NULL**)
* `description` (character varying(4096))
* `options` (text, **NOT NULL**)

**インデックス**:

* `visualizations_pkey` PRIMARY KEY, btree (`id`)

**外部キー制約**:

* `query_id` → `queries(id)`

### widgets

**説明**: ウィジェット（ダッシュボード上のコンポーネント）。

**カラム**:

* `updated_at` (timestamp with time zone, **NOT NULL**)
* `created_at` (timestamp with time zone, **NOT NULL**)
* `id` (integer, **NOT NULL**, デフォルト: `nextval('widgets_id_seq'::regclass)`)
* `visualization_id` (integer)
* `text` (text)
* `width` (integer, **NOT NULL**)
* `options` (text, **NOT NULL**)
* `dashboard_id` (integer, **NOT NULL**)

**インデックス**:

* `widgets_pkey` PRIMARY KEY, btree (`id`)
* `ix_widgets_dashboard_id` btree (`dashboard_id`)

**外部キー制約**:

* `dashboard_id` → `dashboards(id)`
* `visualization_id` → `visualizations(id)`