S8 — RLPD Official Website — Target Schema (Phase 2)¶
TARGET DESIGN — ไม่ใช่ schema ปัจจุบัน
ออกแบบใหม่เพื่อ implement requirement จาก SRS S8 v2.0.0 (TOR 7.18) · สถานะปัจจุบัน (legacy RLPD_WEB .226) อยู่ที่
../../s8_website/ · 📋 สิ่งที่ต่างจากเดิม · DDL เต็ม: schema.sql · ERD · Data Dictionary · 🛠️ Backend Implementation
ทำไมต้อง redesign¶
legacy RLPD_WEB มี 81 ตาราง / 0 FK และมีตารางขยะจำนวนมาก: Content++, Content_copy1,
Content_Article_copy1/2/3, Content_bk_250368bb, Menu_copy1, Users_bk111267, Zipcodes_tmp ฯลฯ
target design นี้ทำให้:
- normalize + FK ครบ (referential integrity ที่ legacy ไม่มี)
- เพิ่ม content workflow (DRAFT→PENDING→APPROVED→PUBLISHED) รองรับ role
CONTENT_EDITOR/CONTENT_APPROVER - เพิ่มของใหม่ตาม SRS: MediaVariant (auto-resize), EmbedCode/EmbedCodeAudit, ApiClient/ApiAccessLog, SearchLog, AccessibilityIssue
- ตัด multi-language ให้เป็น
*Translationแบบเดียวกันทุกที่
Role Hierarchy (SRS §3.1) — บริหารรวมศูนย์¶
SUPER_ADMIN · DEPARTMENT_ADMIN · CONTENT_EDITOR · CONTENT_APPROVER · API_CONSUMER · PUBLIC_USER
กำหนดสิทธิ์ที่เดียว (ทุกระบบ)
role เหล่านี้ ลงทะเบียน + มอบสิทธิ์ที่ส่วนกลาง ไม่ได้อยู่ใน S8:
role catalog → PORTAL.ModuleRoles (SystemCode=S8) · การมอบสิทธิ์ → PORTAL.UserRole + Keycloak client roles (อ่านจาก JWT)
· S8 เก็บแค่ map central role → เมนูในแอป ที่ WEB.RoleMenu · ดู Backend Implementation §5
🔑 Requirement → Table Traceability (spine)¶
| REQ | TOR | สาระสำคัญ | ตารางที่รองรับ |
|---|---|---|---|
| REQ-WEB-001 | 7.18.2 | WCAG 2.2 AA (เน้น Critical) | ส่วนใหญ่ frontend — persist เฉพาะ AccessibilityIssue (Known-Issues + Accessibility Statement) · alt text เก็บใน BannerTranslation.Alt, MediaAsset.AltText, Popup.Alt |
| REQ-WEB-002 | 7.18.3 | Template/UI, Department Selection, Navbar ปรับเองได้ | Template, ThemeColor, DepartmentTheme, DepartmentThemeHistory, Department, Menu, MenuTranslation, MenuType |
| REQ-WEB-003 | 7.18.4 | CMS: WYSIWYG/HTML, upload/embed, Banner+Article auto-resize | Content, ContentArticle, ContentRevision, ContentType, Category, CategoryTranslation, MediaAsset, MediaVariant, MediaType, ContentAttachFile, ContentImage, Banner, BannerTranslation, BannerType, BannerLocation, BannerSetting, BannerGroup, Popup, Faq, FaqQuestion, Calendar, CalendarCategory, Footer, FooterItem |
| REQ-WEB-004 | 7.18.5 | Embed Code (Header/Footer/Section), per-department toggle, Super-Admin guard, audit | EmbedCode, EmbedCodeAudit |
| REQ-WEB-005 | 7.18.6 | Backend perf, Article Search, Login เร็ว | SearchLog (ARTICLE) + note: full-text catalog; caching/perf-monitor = app/infra, ไม่มีผลต่อ schema; Login = Keycloak SSO (lockout = realm policy) |
| REQ-WEB-006 | 7.18.7 | Internal Search (เมนูตั้งค่า + ไฟล์อัปโหลด) + history | SearchLog (INTERNAL), AdminMenu, MediaAsset (เป็น target การค้นหา) |
| REQ-WEB-007 | Extra | Web API ข่าวสาร/บทความ — API Key/OAuth, rate limit, versioning, audit | ApiClient, ApiClientScope, ApiAccessLog |
REQ ที่ไม่มีผลต่อ schema (จัดการที่ app/infra layer)
- WCAG rendering (contrast, keyboard nav, screen-reader) — frontend (เก็บได้แค่ Known-Issues register)
- Caching / Performance Monitoring (REQ-WEB-005) — reverse-proxy / APM
- Article Search engine — SQL Server Full-Text Catalog หรือ Elasticsearch (schema เตรียม
SearchLog+ คอลัมน์ที่ index ได้) - XSS filtering ของ Embed Code — sanitizer ที่ app layer (schema เก็บ snippet + audit)
Table Inventory (46 ตาราง, schema WEB)¶
| กลุ่ม | ตาราง |
|---|---|
| Shared/i18n | Language |
| Department | Department |
| Template/Theme | Template, ThemeColor, DepartmentTheme, DepartmentThemeHistory |
| Navigation | MenuType, Menu, MenuTranslation |
| Media | MediaType, MediaAsset, MediaVariant |
| Content/CMS | ContentType, Category, CategoryTranslation, Content, ContentArticle, ContentRevision, ContentAttachFile, ContentImage |
| Banner | BannerType, BannerLocation, BannerGroup, Banner, BannerTranslation, BannerSetting |
| Widgets | Popup, Faq, FaqQuestion, CalendarCategory, Calendar, Footer, FooterItem |
| Embed | EmbedCode, EmbedCodeAudit |
| Users/AuthZ | Position, User (SSO profile), AdminMenu, RoleMenu (keyed by central role) — role catalog/grants อยู่ที่ PORTAL+Keycloak |
| Web API | ApiClient, ApiClientScope, ApiAccessLog |
| Search/Log | SearchLog, AuditLog, PublicAccessLog |
| Accessibility | AccessibilityIssue |
Legacy → Target migration map (สรุป)¶
| Legacy (RLPD_WEB) | Target (WEB) | หมายเหตุ |
|---|---|---|
Department |
Department |
+ ฟิลด์ social, parent self-ref |
Theme_Choice / Theme / Theme_Color |
Template / DepartmentTheme / ThemeColor |
template เป็น first-class |
Content (+ ++,copy1,bk) |
Content |
ทิ้ง ตารางซ้ำทั้งหมด, เพิ่ม Status workflow |
Content_Article (+ copy1/2/3) |
ContentArticle + ContentRevision |
revision/approval แยกออก |
AttachFile / Content_IMG |
MediaAsset + MediaVariant / ContentImage |
original + resized |
Menu (+ Menu_copy1) / Menu_Detail |
Menu / MenuTranslation |
|
Users (+ _bk) |
User |
เลิกเก็บ password → ผูก Keycloak SSO (KeycloakUserId); keep Identity_id→CitizenId; lockout/aging = Keycloak realm policy |
Role / UserRoles |
→ PORTAL.ModuleRoles + PORTAL.UserRole + Keycloak | ย้ายไปบริหารกลาง (ไม่อยู่ใน S8) |
Role_Menu / Tm_Menu |
RoleMenu / AdminMenu |
RoleMenu keyed by central role code |
inline Embed_Code column |
EmbedCode (+ audit) |
จัดการเป็นรายตำแหน่ง |
| (ไม่มี) | ApiClient*, SearchLog, AccessibilityIssue, MediaVariant |
ของใหม่ตาม SRS |
Survey* |
(ใช้ Survey ของ S9 ตาม REQ-WPT-009) | S9 เป็นเจ้าของแบบประเมินกลาง — S8 ฝัง widget |
หมายเหตุ: ตาราง
Survey*ของ legacy S8 ไม่ยกมา เพราะ Phase 2 รวมแบบประเมินความพึงพอใจไว้ที่ S9 (REQ-WPT-009) เป็นระบบกลาง — เว็บไซต์ S8 เพียงฝัง icon/popup ที่ชี้ไปยัง Survey ของ Portal⚠️ ข้อมูลเดิมต้องตัดสินใจแยก: legacy
SurveyAnswerDetailมีคำตอบจริง (IP/Device/Browser) — ต้องมี แผน archive/migrate ข้อมูลแบบประเมินเดิม ก่อนเลิกใช้ตาราง legacy (ไม่ใช่แค่ย้ายฟีเจอร์)