可視性が変わりうる対象への参照は id だけ保存し、読み出し時に現在の公開状態でフィルタして解決する
セキュリティ
設計判断
データモデリング
判断
原則
ある主張やレコードの「裏づけ・関連リンク(証跡、外部参照)」を永続化するとき、参照先の公開/非公開・有効/削除といった状態が後から変わりうるなら、参照は対象の id だけを保存し、表示用のタイトルなどのスナップショットを非正規化保存しない。表示に必要な属性は読み出し時に対象を引き直し、現在の公開状態・所有権でフィルタしてから解決する。
判断基準
- 参照先の可視性や有効性が時間で変わるか問う。変わるなら id 保存 + 読み出し時解決。変わらない不変属性だけなら非正規化スナップショットも可。
- 読み出し時の解決では、対象集合をまとめて引き、公開かつ正当な所有者のものだけを残す。条件はプロンプトや呼び出し側の遵守に頼らず、解決ロジック側で強制する。
- 書き込み時も同じ条件で参照 id をフィルタし、非公開・他人・不存在の id は保存前に落とす。生成側が不正 id を渡しても証跡として永続化させない防御を入れる。
理由
- スナップショットを保存すると、対象が後で非公開化・削除・改名されても古い値が表示に残り、陳腐化・情報漏れ・「実体のない偽の根拠」になる。検証可能性を売りにする画面ほど致命的。
- id だけ持てば表示は常に最新で、可視性変更が即時に反映され、保存データも軽い。
落とし穴
- 読み出しごとに対象を引く分のクエリが増えるが、id 一括取得で参照件数は有界なので通常許容できる。N+1 にしないようまとめて引く。
- 書き込み検証を入れないと、入力された id をそのまま信じて非公開対象を公開面に露出させる事故が起きる。
検証
- 参照先を後から非公開化し、その参照が表示・出力から消えることを確認する。残るならスナップショット由来か読み出しフィルタ漏れ。
- 他人所有や存在しない id を書き込み入力に混ぜ、保存後に除外されているかを確認する。