92 lines
2.6 KiB
Markdown
92 lines
2.6 KiB
Markdown
# DB Schema(新架構)
|
||
|
||
## 1) 設計原則
|
||
- 權限以群組為中心,不使用會員直接細粒度授權流程
|
||
- `scope` 固定為 `site`
|
||
- `action` 只允許 `view`、`edit`(可同時存在)
|
||
- DB 真實執行來源:`backend/scripts/init_schema.sql`
|
||
|
||
## 2) 核心實體
|
||
- `companies`
|
||
- `id` (PK)
|
||
- `company_key` (UNIQUE)
|
||
- `name`, `status`, `created_at`, `updated_at`
|
||
- `sites`
|
||
- `id` (PK)
|
||
- `site_key` (UNIQUE)
|
||
- `company_id` (FK -> companies.id)
|
||
- `name`, `status`, `created_at`, `updated_at`
|
||
- `users`
|
||
- `id` (PK)
|
||
- `authentik_sub` (UNIQUE)
|
||
- `authentik_user_id`, `email` (UNIQUE), `display_name`, `is_active`
|
||
- `systems`
|
||
- `id` (PK)
|
||
- `system_key` (UNIQUE)
|
||
- `name`, `status`
|
||
- `modules`
|
||
- `id` (PK)
|
||
- `module_key` (UNIQUE)
|
||
- `system_id` (FK -> systems.id)
|
||
- `name`, `status`
|
||
- `permission_groups`
|
||
- `id` (PK)
|
||
- `group_key` (UNIQUE)
|
||
- `name`, `status`
|
||
|
||
## 3) 群組關聯(多對多)
|
||
- `permission_group_members`
|
||
- `group_id` (FK -> permission_groups.id)
|
||
- `user_id` (FK -> users.id)
|
||
- UNIQUE (`group_id`, `user_id`)
|
||
- `permission_group_sites`
|
||
- `group_id` (FK -> permission_groups.id)
|
||
- `site_id` (FK -> sites.id)
|
||
- UNIQUE (`group_id`, `site_id`)
|
||
- `permission_group_systems`
|
||
- `group_id` (FK -> permission_groups.id)
|
||
- `system_id` (FK -> systems.id)
|
||
- UNIQUE (`group_id`, `system_id`)
|
||
- `permission_group_modules`
|
||
- `group_id` (FK -> permission_groups.id)
|
||
- `module_id` (FK -> modules.id)
|
||
- UNIQUE (`group_id`, `module_id`)
|
||
- `permission_group_actions`
|
||
- `group_id` (FK -> permission_groups.id)
|
||
- `action` (`view` | `edit`)
|
||
- UNIQUE (`group_id`, `action`)
|
||
|
||
## 4) 查詢預期
|
||
- 系統頁關聯:
|
||
- 查 `permission_group_systems` 取群組
|
||
- 經 `permission_group_members` 推導涉及會員
|
||
- 模組頁關聯:
|
||
- 查 `permission_group_modules` 取群組
|
||
- 經 `permission_group_members` 推導涉及會員
|
||
- 公司頁站台:
|
||
- 查 `sites` by `company_id`
|
||
- 會員頁群組:
|
||
- 查 `permission_group_members` by `user_id`
|
||
|
||
## 5) 驗收查核(SQL)
|
||
```sql
|
||
-- 1) 檢查主表是否存在
|
||
SELECT tablename
|
||
FROM pg_tables
|
||
WHERE schemaname = 'public'
|
||
AND tablename IN (
|
||
'companies','sites','users','systems','modules','permission_groups',
|
||
'permission_group_members','permission_group_sites',
|
||
'permission_group_systems','permission_group_modules','permission_group_actions'
|
||
)
|
||
ORDER BY tablename;
|
||
|
||
-- 2) 檢查 action 值域
|
||
SELECT DISTINCT action FROM permission_group_actions ORDER BY action;
|
||
|
||
-- 3) 檢查群組可同時有 view/edit
|
||
SELECT group_id, array_agg(action ORDER BY action) AS actions
|
||
FROM permission_group_actions
|
||
GROUP BY group_id;
|
||
```
|