k3s-io/kineがPostgreSQLに作成するテーブルのスキーマ

**k3s-io/kine**（Kubernetes用のetcd互換ストア）は、PostgreSQL上に**`kine`**という単一のテーブルを作成し、Kubernetesのデータを保存します ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=,kine))。以下、このテーブルの詳細なスキーマを示します。

## テーブル名
- **テーブル名**: `kine` （存在しない場合に作成される） ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=,kine))  
  *※kineは起動時にこのテーブルの存在を確認し、無ければ`CREATE TABLE IF NOT EXISTS kine (...)`で作成します。*

## カラム名とデータ型
`kine`テーブルには以下のカラムが存在します。それぞれのカラム名とデータ型は次のとおりです（必要に応じて簡単な説明を付記します）。

- **id** – `BIGSERIAL`型（64ビット整数の自動インクリメント）。主キーとして設定されています ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=id%20BIGSERIAL%20PRIMARY%20KEY%2C))。  
- **name** – `TEXT`型（照合順序 **"C"** を指定） ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=name%20text%20COLLATE%20))。Kubernetesオブジェクトのキー名を保持します。照合順序"C"はプレフィックス検索などでインデックスを効率的に利用するために設定されています ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=%2F%2F%20It%20is%20important%20to,ensure%20that%20LIKE%20and%20COMPARISON))。  
- **created** – `INTEGER`型 ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=created%20INTEGER%2C))。エントリの作成時刻や作成バージョンを表す値です（32ビット整数）。  
- **deleted** – `INTEGER`型 ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=created%20INTEGER%2C))。エントリの削除フラグや削除時刻を表す値です（0/1フラグやタイムスタンプとして使用）。  
- **create_revision** – `BIGINT`型（64ビット整数） ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=deleted%20INTEGER%2C))。エントリが初めて作成された際の**リビジョン番号**（Kubernetesリソースバージョンに相当）を保持します。  
- **prev_revision** – `BIGINT`型 ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=create_revision%20BIGINT%2C))。このエントリが上書きした**直前のリビジョン番号**を保持します（前の履歴エントリへの参照）。  
- **lease** – `INTEGER`型 ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=prev_revision%20BIGINT%2C))。エントリに関連付けられたLease ID（TTLがある場合）を保持します。  
- **value** – `BYTEA`型（バイナリデータ） ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=value%20bytea%2C))。エンコードされた実際の値（オブジェクトの内容）をバイナリ形式で保存します。  
- **old_value** – `BYTEA`型（バイナリデータ） ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=value%20bytea%2C))。更新前の古い値をバイナリ形式で保持します（必要に応じて比較や監査に利用）。  

※上記のうち`id`カラムには`PRIMARY KEY`制約が付与されています（BIGSERIALには暗黙的にシーケンス`kine_id_seq`が作成され、自動採番されます） ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=id%20BIGSERIAL%20PRIMARY%20KEY%2C))。

## インデックスおよび制約
kineテーブルでは、パフォーマンスと一意性を確保するために複数のインデックスと制約が定義されています。

- **主キー (Primary Key)**: `id`カラムに主キー制約（PRIMARY KEY）が設定されています ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=id%20BIGSERIAL%20PRIMARY%20KEY%2C))。これにより`id`は一意かつNULL不可となり、テーブル内で各行を一意に識別します。  
- **一意インデックス**: `name`と`prev_revision`の複合に対して**ユニークインデックス**が張られています ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=,name%2C%20prev_revision))。これにより、同じ`name`を持つエントリが同一の`prev_revision`（前履歴）を重複して持つことがないよう保証しています。  
- **インデックス (name)**: `name`カラム単体に対するインデックスが作成されています ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=,name))。`name`での検索（プレフィックス一致を含む）を高速化します。  
- **インデックス (name, id)**: `name`と`id`の複合インデックスがあります ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=,name))。主に`name`で絞り込んだ上で`id`（リソースバージョン相当）順に並べ替えるようなクエリに利用されます。  
- **インデックス (id, deleted)**: `id`と`deleted`の複合インデックスがあります ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=,name))。特定の`id`範囲で削除済みでないエントリを効率よく取得するためのものです。  
- **インデックス (prev_revision)**: `prev_revision`カラムに対するインデックスがあります ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=,name))。あるリビジョンを直前のリビジョンに持つエントリの検索を高速化します。  
- **インデックス (name, id DESC, deleted)**: `name`、`id (降順)`、および`deleted`の複合インデックスが追加されています ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=,name%2C%20id%20DESC%2C%20deleted))。これは各`name`ごとに最新の（最大の）`id`を持つエントリを効率的に取得する用途に最適化されたインデックスです（クエリ内で`ORDER BY name, id DESC`を用いた「最新の状態」の取得を高速化） ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=,name%2C%20id%20DESC%2C%20deleted))。  

以上のインデックス構成により、KineはPostgreSQL上でのKubernetesデータの読み書きを高速化しています。

## スキーママイグレーション（変更履歴）
Kineではバージョンアップに伴いスキーマ変更が行われた経緯があります。**公式ドキュメント**のK3sリリースノートによれば、Kine v0.13.0でPostgreSQL使用時のパフォーマンス改善のためスキーマが更新されています ([v1.32.X | K3s](https://docs.k3s.io/release-notes/v1.32.X#:~:text=,KINE_SCHEMA_MIGRATION%3D2))。新規にデータベースを作成する場合は自動で新スキーマが適用され、既存データベースについては環境変数`KINE_SCHEMA_MIGRATION=2`を指定して起動することでスキーマ変更を適用できます ([v1.32.X | K3s](https://docs.k3s.io/release-notes/v1.32.X#:~:text=,KINE_SCHEMA_MIGRATION%3D2))。

具体的な変更点として、Kineのソースコード中のマイグレーション定義では次のようなスキーマ変更が含まれています。

- **整数型の拡張**: `id`, `create_revision`, `prev_revision`の各カラムを**BIGINT型**に変更する（以前のバージョンでは小さめの整数型だった可能性があります） ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=,ALTER%20SEQUENCE%20kine_id_seq%20AS%20BIGINT))。これにより非常に大きなリビジョン番号にも対応でき、リソースバージョンがオーバーフローしないようになっています。 ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=,ALTER%20SEQUENCE%20kine_id_seq%20AS%20BIGINT))  
- **文字列比較の最適化**: `name`カラムのデータ型に対し照合順序`"C"`を適用する変更 ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=%2F%2F%20It%20is%20important%20to,ensure%20that%20LIKE%20and%20COMPARISON))。これにより`name`に対する`LIKE`や比較クエリでインデックスが効きやすくなり、PostgreSQL上でのパフォーマンスが向上します（照合順序を"C"にすることでバイナリ比較となり、インデックス利用が可能になるため） ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=%2F%2F%20It%20is%20important%20to,ensure%20that%20LIKE%20and%20COMPARISON))。  

これらの変更はKine内部のマイグレーション機構によって管理されており、新しいスキーマ定義（前述のカラム定義・インデックス定義）は常に最新バージョン用にコード内で定義されています ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=schemaMigrations%20%3D%20%5B%5Dstring))。そのため、新規インストール時には最新スキーマでテーブルが作られ、既存インストールのアップグレード時には必要に応じて上記マイグレーションが実行される形になっています。

**参考資料:** 公式ドキュメントやソースコードでは上記のようなスキーマが確認できます ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=,kine)) ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=id%20BIGSERIAL%20PRIMARY%20KEY%2C)) ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=,name%2C%20prev_revision))。特にKineのソースコード（GitHub上の`kine/pkg/drivers/pgsql/pgsql.go`）にテーブル作成DDLとインデックス定義が記載されており、これが信頼できるスキーマ情報となります ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=id%20BIGSERIAL%20PRIMARY%20KEY%2C)) ([kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub](https://github.com/rancher/kine/blob/master/pkg/drivers/pgsql/pgsql.go#:~:text=,name))。また、K3sリリースノートにもスキーマ変更に関する言及があります ([v1.32.X | K3s](https://docs.k3s.io/release-notes/v1.32.X#:~:text=,KINE_SCHEMA_MIGRATION%3D2))。