# 住民記録システム Web版 ER図

準拠：住民記録システム標準仕様書 第6.1版（令和8年3月25日）／ 第3章 1.管理項目・4.異動・5.証明 ほか／ データ要件・連携要件標準仕様書

## 1. 全体ER（コア）

凡例：PK=主キー、FK=外部キー、SCD-2=Slowly Changing Dimension Type2（履歴保持）
erDiagram RESIDENT ||--o| RESIDENT_FOREIGNER : "1:0..1" RESIDENT ||--o{ RESIDENT_HISTORY : "1:N (SCD-2)" RESIDENT ||--o{ ALIAS_NAME : "通称・旧氏" RESIDENT ||--o{ JUMIN_CODE : "住民票コード履歴" RESIDENT ||--o{ MY_NUMBER : "個人番号履歴" RESIDENT }o--|| HOUSEHOLD : "現世帯" RESIDENT ||--o{ HOUSEHOLD_MEMBER : "世帯所属(履歴)" HOUSEHOLD ||--o{ HOUSEHOLD_MEMBER : "1:N" RESIDENT ||--o{ RESTRICTION : "DV等支援措置" RESIDENT ||--o{ TRANSACTION : "対象住民" TRANSACTION ||--o{ TRANSACTION_ITEM : "項目別変更" TRANSACTION }o--|| TRANSACTION_TYPE : "区分(届出/職権)" TRANSACTION ||--o{ TRANSACTION_APPROVAL : "決裁ルート" TRANSACTION ||--o{ CERTIFICATE_ISSUE : "発行起点(任意)" RESIDENT ||--o{ CERTIFICATE_ISSUE : "発行履歴" USER_ACCOUNT ||--o{ AUDIT_LOG : "1:N" USER_ACCOUNT }o--o{ ROLE : "M:N (USER_ROLE)" ROLE ||--o{ PERMISSION : "1:N" LINK_PARTNER ||--o{ LINK_EVENT : "連携イベント" TRANSACTION ||--o{ LINK_EVENT : "派生連携" REPORT_REQUEST }o--|| USER_ACCOUNT : "依頼者" RESIDENT { varchar resident_id PK "宛名番号" varchar household_id FK varchar family_name_kanji varchar given_name_kanji varchar family_name_kana varchar given_name_kana date birth_date char sex varchar nationality "外国人時" varchar address_code varchar address_text date moved_in_date date moved_out_date boolean restricted_flag timestamp valid_from timestamp valid_to } RESIDENT_FOREIGNER { varchar resident_id PK,FK varchar residence_status date residence_period_end varchar passport_no varchar nationality_full varchar alias_kanji "通称" boolean special_permanent_resident } HOUSEHOLD { varchar household_id PK varchar head_resident_id FK varchar address_code varchar address_text date established_date date closed_date } HOUSEHOLD_MEMBER { varchar household_id PK,FK varchar resident_id PK,FK varchar relation_to_head date joined_date date left_date } RESIDENT_HISTORY { varchar resident_id PK,FK timestamp valid_from PK timestamp valid_to jsonb snapshot "全項目スナップショット" varchar transaction_id FK } ALIAS_NAME { bigint alias_id PK varchar resident_id FK varchar kind "通称/旧氏" varchar value_kanji varchar value_kana date valid_from date valid_to } JUMIN_CODE { bigint id PK varchar resident_id FK varchar code "11桁" date valid_from date valid_to varchar event "付番/変更/修正" } MY_NUMBER { bigint id PK varchar resident_id FK varchar number "12桁(暗号化)" date valid_from date valid_to varchar event } RESTRICTION { bigint restriction_id PK varchar resident_id FK varchar category "DV/ストーカー/児童虐待" date start_date date end_date varchar scope "本人/世帯" varchar release_role text note } TRANSACTION { varchar transaction_id PK varchar resident_id FK varchar household_id FK varchar type_code FK "届出/職権/取消等" varchar reason_code date event_date "異動年月日" date processed_date varchar receiver_office varchar status "起票/審査/承認/反映/取消" varchar parent_transaction_id FK "取消元" } TRANSACTION_TYPE { varchar code PK varchar name varchar category "届出/職権/連動/取消" } TRANSACTION_ITEM { varchar transaction_id PK,FK varchar field PK text value_before text value_after } TRANSACTION_APPROVAL { bigint id PK varchar transaction_id FK int step varchar role varchar approver_user_id FK varchar status text comment timestamp acted_at } CERTIFICATE_ISSUE { bigint issue_id PK varchar resident_id FK varchar transaction_id FK varchar form_id "0010001 等" int copies varchar usage_text int fee varchar verify_token "改ざん防止" timestamp issued_at varchar issuer_user_id FK varchar channel "窓口/コンビニ/オンライン" } USER_ACCOUNT { varchar user_id PK varchar oidc_subject varchar employee_no varchar department varchar full_name boolean active } ROLE { varchar role_id PK varchar name text description } USER_ROLE { varchar user_id PK,FK varchar role_id PK,FK date valid_from date valid_to } PERMISSION { varchar role_id PK,FK varchar resource PK "機能/項目" varchar action PK "view/edit/approve" varchar mask "個人番号 等" } AUDIT_LOG { bigint log_id PK varchar user_id FK varchar ip varchar action varchar resource_type varchar resource_id timestamp occurred_at jsonb details } LINK_PARTNER { varchar partner_id PK varchar name "CS/番号/戸籍/税/国保/選挙/申請管理" varchar endpoint varchar protocol } LINK_EVENT { bigint event_id PK varchar partner_id FK varchar transaction_id FK varchar direction "in/out" timestamp occurred_at varchar status jsonb payload } REPORT_REQUEST { bigint report_id PK varchar requester_user_id FK varchar template_id jsonb params varchar status varchar file_path timestamp created_at }

## 2. 履歴管理（SCD-2）の考え方

- RESIDENT は現在値のみを保持。すべての変更は TRANSACTION + TRANSACTION_ITEM + RESIDENT_HISTORY（jsonb スナップショット）に記録。
- 時点照会（標準仕様書 1.2.1）は `RESIDENT_HISTORY.valid_from <= asOf < valid_to` で1行を特定。
- 取消（4.6）は `TRANSACTION.parent_transaction_id` を辿る論理取消。物理削除は禁止。
- 個人番号・住民票コードは独立テーブルで世代管理し、最新は `valid_to IS NULL`。

## 3. 抑止・権限（10.3 / 10.4）

- RESIDENT 取得時は RESTRICTION を必ず参照。要求ユーザのROLEに `PERMISSION.action='view'` が無ければ 404 相当を返す（存在自体を隠蔽）。
- 項目別マスク：`PERMISSION.mask` に「個人番号」「住民票コード」等を列挙し、API レイヤで値を `****` に置換。
- 抑止解除権限を持つロールのみ、解除画面 (SCR-301) へのアクセスを許可。

## 4. インデックス指針（PostgreSQL）

テーブル | インデックス | 用途
--- | --- | ---
resident | (family_name_kana, given_name_kana) | カナ検索
resident | (birth_date) | 生年月日絞り込み
resident | GIN (address_text gin_trgm_ops) | 住所あいまい検索
resident | UNIQUE (jumin_code) WHERE valid_to IS NULL | 現行コード一意
my_number | UNIQUE (number_hash) WHERE valid_to IS NULL | 重複検知
resident_history | (resident_id, valid_from DESC) | 時点照会
transaction | (resident_id, event_date DESC) | 履歴一覧
audit_log | (occurred_at, user_id) | 監査参照

## 5. ソース（Mermaid）コピー用

展開して全文を表示／コピー

    erDiagram
      (上のMermaid図の本文を参照)