GIS開発研究所 > QGISで設備点検履歴を親子管理する方法|PostGISリレーション設計
2026年7月25日
•約6分で読めます
QGISとPostGISで設備台帳と点検履歴を1対多で管理する方法を解説します。主キー・外部キー・入力フォーム・最新点検ビューを整え、履歴を上書きせず現場で安全に追加できるデータ構成と運用上の確認項目をSQL例付きで紹介し、再発防止まで扱います。
道路、管路、標識、設備などをQGISで管理していると、「最新の点検結果を設備レイヤーに上書きしてよいのか」で迷うことがあります。上書きだけで運用すると、前回の状態や修繕の経緯が分からなくなってしまいます。
設備の基本情報と点検履歴は、別テーブルに分けて1つの設備に複数の点検履歴をひも付けるのが基本です。この記事では、PostGISのテーブル設計からQGISの入力フォームまで順番に説明します。
まず、次の2つにデータを分けます。
設備テーブルの主キーを、点検履歴テーブルの外部キーから参照します。これが1対多リレーションです。
設備1件
├─ 2026年4月の点検
├─ 2026年7月の点検
└─ 2026年10月の点検
次は最小構成の例です。設備の位置はassetsに持ち、点検履歴はinspectionsへ追加します。
CREATE TABLE assets (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
asset_code text NOT NULL UNIQUE,
asset_name text NOT NULL,
installed_on date,
geom geometry(Point, 6677) NOT NULL
);
CREATE TABLE inspections (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
asset_id bigint NOT NULL
REFERENCES assets(id)
ON UPDATE CASCADE
ON DELETE RESTRICT,
inspected_on date NOT NULL,
result text NOT NULL,
inspector_name text,
note text,
created_at timestamptz NOT NULL DEFAULT now()
);
CREATE INDEX inspections_asset_id_idx
ON inspections(asset_id);
ON DELETE RESTRICTを指定すると、点検履歴が残っている設備を誤って削除しにくくなります。設備削除と同時に履歴も消す運用ならCASCADEも使えますが、監査や過去確認が必要な業務では慎重に選びましょう。
PostGISの2テーブルをQGISへ追加したら、次の順で設定します。
assets、主キーにidを指定するinspections、外部キーにasset_idを指定するPostgreSQL側に外部キーを定義している場合、QGISの「リレーションを検出」から読み込めることがあります。公式ドキュメントでも、PostgreSQLやGeoPackageに保存されたリレーションを検出できると説明されています。
リレーションを設定すると、設備の地物フォーム内に関連する点検履歴が一覧表示されます。設備を地図上で選び、その画面から新しい点検履歴を追加できるようになります。
入力しやすくするには、点検履歴レイヤーの属性フォームも整えます。
inspected_onは初期値を現在日にするresultは「良好・要観察・要修繕」などの選択式にするinspector_nameは担当者マスタから選ぶnoteは複数行入力にするasset_idはフォーム上で直接変更させない現場担当者が主キーや外部キーを意識しなくても入力できる画面にするのがポイントです。
親子のレイヤーが両方ともQGISプロジェクトに読み込まれているか確認します。リレーションの親キーと子キーが逆になっていないかも見直しましょう。
点検履歴のasset_idに、存在しない設備IDが入っている可能性があります。QGISのリレーションフォームから追加すると、親設備のIDを引き継ぎやすくなります。
PostGISの外部キー設定と、QGISのリレーション強度を確認します。「構成」タイプでは親子を一体として扱う動作が含まれるため、通常の履歴管理では「関連」タイプから検討すると分かりやすいです。
履歴を分けると、設備ごとの最新結果を取り出す処理も必要になります。PostgreSQLでは、次のようなビューを作れます。
CREATE VIEW asset_latest_inspection AS
SELECT DISTINCT ON (a.id)
a.id AS asset_id,
a.asset_code,
a.asset_name,
i.inspected_on,
i.result,
i.inspector_name,
a.geom
FROM assets a
LEFT JOIN inspections i ON i.asset_id = a.id
ORDER BY a.id, i.inspected_on DESC, i.id DESC;
このビューは確認用に使い、点検結果の登録は元のinspectionsテーブルへ行います。ビューを直接編集できるかは構成によって変わるため、入力先と表示用を分けると事故を減らせます。
設備の撤去後も点検履歴を残したい場合、設備レコードを削除せずretired_onやactiveを持たせる方法があります。これなら、現役設備だけをQGISに表示しながら、過去の記録も保持できます。
**設備台帳は現在の状態、点検履歴は時間の流れを保存するデータです。**この2つを分けるだけで、QGISのフォームも集計も扱いやすくなります。
設備点検のデータ構造やQGIS入力画面の設計を整理したい場合は、GIS開発を無料相談する。
千葉県出身。10歳の頃からプログラミングを始め、ゲーム、Webサイト、ロボット、スマホアプリなどを制作。大阪大学基礎工学部情報科学科で情報工学と統計学を学び、大学時代はAIを研究。大学在学中にWeb広告代理店でのインターンや人材系Webサービスの立ち上げを経験し、卒業後はフリーランスエンジニアとしてGISシステム、データ基盤構築、Webシステムの開発に従事。10年以上のWebアプリ開発・データ分析経験を基に、2023年9月に株式会社ビットライトを設立し、現場業務の仕組み化からデータ基盤構築、データ活用支援までを一気通貫で支援。