# Data Model

本文件定義 File Access Agent 的「可選」持久化模型，不是預設必備。

## 1. 設計前提

- 預設模式為無 DB，metadata 由 bucket provider 提供。
- 部署採 single-tenant instance：同一個 instance 只處理一個 tenant 的資料。
- 若啟用持久化，`tenant_id` 仍保存在資料中，作為稽核與跨環境遷移邊界欄位。

## 2. 何時才需要持久化

只有在下列需求出現時，才建議加 DB：

- 審計落地（合規或追蹤）
- token `jti` replay 防護
- 額外索引需求（例如 `file_id` 到 `object_key` 快取映射）

## 3. 最小可選資料表

建議最小可選表：`file_object_refs`

用途：

- 保存 `file_id` 到 `object_key` 的輕量映射（若上游要求）

欄位：

- `id`：UUID 或 ULID，internal id
- `tenant_id`：UUID，應等於 instance 固定 tenant
- `file_id`：string，唯一
- `object_key`：string，唯一
- `created_at`：timestamp
- `updated_at`：timestamp

索引：

- unique(`file_id`)
- unique(`object_key`)
- index(`updated_at`)

## 4. 其他可選資料表

### 3.1 `file_access_audit_logs`

用途：追蹤 upload/download/metadata/delete 操作

欄位：

- `id`
- `tenant_id`
- `object_key`
- `action` (`upload|download|metadata|delete`)
- `actor_type` (`service|client`)
- `actor_id` nullable
- `result` (`allow|deny`)
- `reason_code` nullable
- `created_at`

### 3.2 `token_jti_registry`

用途：若之後要做 delegated token replay 防護

欄位：

- `jti`
- `tenant_id`
- `expires_at`
- `consumed_at` nullable

## 5. 儲存技術建議

### 4.1 SQLite（建議起步）

適用（啟用持久化時）：

- 單 instance
- 中低流量
- 結構固定、查詢簡單

優點：

- 部署成本最低
- C# 生態成熟（EF Core + SQLite）

風險：

- 高併發寫入能力有限
- 多副本部署需額外設計一致性

### 4.2 文件型 NoSQL

適用（啟用持久化時）：

- 主要是 key lookup，關聯少
- 僅存映射或審計文件，不做複雜 join

優點：

- schema 彈性高
- `metadata_json` 可原生存取

風險：

- 交易與一致性語意通常較弱
- 後續做複雜查詢或審計統計可能要補額外索引設計

### 4.3 PostgreSQL

適用（啟用持久化時）：

- 需要高併發與穩定維運
- 需要更完整審計與分析查詢

優點：

- 可靠、可擴展、與 Member Center 堆疊一致
- `jsonb` 可兼顧結構化與彈性欄位

風險：

- 維運成本高於 SQLite

## 6. 建議路線

1. `v1`：無 DB（預設）
2. `v1.5`：若需要映射或審計，先上 SQLite + `file_object_refs`（必要時加 `file_access_audit_logs`）
3. `v2`：若流量或治理需求提升，再評估 PostgreSQL 或 NoSQL
