Database Schema Design
ระบบผู้ดูแลระบบ (System Administrator Management System)
โรงพยาบาลค่ายธนรัชน์
เอกสารเลขที่: SRS-1.2.21-SCHEMA
เวอร์ชัน: 1.0
วันที่: 7 ตุลาคม 2568
ผู้จัดทำ: ทีมพัฒนาระบบ
ผู้อนุมัติ: ผู้อำนวยการโรงพยาบาลค่ายธนรัชน์
การปรับปรุง: ใหม่ - เน้น Identity and Access Management ตามแนวทาง AWS IAM
Database Schema Design
ระบบผู้ดูแลระบบเป็นศูนย์กลางการควบคุมและจัดการระบบ HIS ทั้งหมด ทำหน้าที่จัดการ Identity and Access Management (IAM), การตั้งค่าระบบ, การจัดการฐานข้อมูล, และการสื่อสาร โดยเชื่อมโยงกับระบบอื่นผ่าน Central Management:
- ระบบเวชระเบียน (1.2.1): การควบคุมสิทธิ์การเข้าถึงข้อมูลผู้ป่วย
- ระบบซักประวัติ (1.2.2): การกำหนดสิทธิ์การบันทึกและแก้ไขประวัติ
- ระบบห้องตรวจแพทย์ (1.2.3): การจัดการผู้ใช้งานและการตั้งค่าห้องตรวจ
- ระบบตรวจสอบสิทธิ (1.2.15): การเชื่อมโยงข้อมูล Master Data สิทธิการรักษา
- ระบบการเงิน (1.2.14): การควบคุมสิทธิ์การเข้าถึงข้อมูลการเงิน
- ระบบเภสัชกรรม (1.2.13): การจัดการสิทธิ์การสั่งจ่ายยา
8.2.1 ตารางหลัก (Core Tables)
8.2.1.1 กลุ่ม Identity and Access Management (IAM)
Table: USERS (ข้อมูลผู้ใช้งาน)
วัตถุประสงค์: เก็บข้อมูลผู้ใช้งานระบบทั้งหมด รวมถึงข้อมูลส่วนตัว การยืนยันตัวตน และการตั้งค่าส่วนบุคคล ตามแนวทาง AWS IAM
| Field | Type | Key | Description |
|---|---|---|---|
| user_id | VARCHAR(36) | PK | User ID ในรูปแบบ UUID |
| username | VARCHAR(50) | UK | ชื่อผู้ใช้งาน (unique) |
| VARCHAR(100) | UK | อีเมล (unique) | |
| password_hash | VARCHAR(255) | รหัสผ่านที่เข้ารหัสด้วย bcrypt (bcrypt algorithm) | |
| user_arn | VARCHAR(255) | UK | Amazon Resource Name format |
| user_type | ENUM('SUPER_ADMIN','SYS_ADMIN','DEPT_ADMIN','SEC_ADMIN','END_USER') | ประเภทผู้ใช้งาน | |
| display_name | NVARCHAR(100) | ชื่อที่แสดง | |
| first_name | NVARCHAR(50) | ชื่อ | |
| last_name | NVARCHAR(50) | นามสกุล | |
| employee_id | VARCHAR(20) | รหัสพนักงาน | |
| department_id | VARCHAR(36) | FK | รหัสแผนก (อ้างอิง DEPARTMENTS) |
| position_title | NVARCHAR(100) | ตำแหน่งงาน | |
| phone_number | VARCHAR(20) | หมายเลขโทรศัพท์ | |
| status | ENUM('ACTIVE','INACTIVE','SUSPENDED','LOCKED','EXPIRED') | สถานะการใช้งาน | |
| must_change_password | BOOLEAN | บังคับเปลี่ยนรหัสผ่าน | |
| password_expires_at | DATETIME | วันหมดอายุรหัสผ่าน | |
| last_login_at | DATETIME | เวลาเข้าใช้งานล่าสุด | |
| last_login_ip | VARCHAR(45) | IP Address ล่าสุด | |
| failed_login_attempts | INT | จำนวนครั้งที่ล็อกอินผิด | |
| account_locked_until | DATETIME | เวลาที่บัญชีถูกล็อก | |
| mfa_enabled | BOOLEAN | เปิดใช้ Multi-Factor Authentication | |
| user_preferences | JSON | การตั้งค่าส่วนบุคคล | |
| tags | JSON | ป้ายกำกับสำหรับการจัดกลุ่ม | |
| created_at | DATETIME | วันที่สร้าง | |
| updated_at | DATETIME | วันที่อัปเดตล่าสุด | |
| created_by | VARCHAR(36) | FK | ผู้สร้าง |
| updated_by | VARCHAR(36) | FK | ผู้อัปเดต |
| is_active | BOOLEAN | ใช้งานได้ |
Table: GROUPS (กลุ่มผู้ใช้งาน)
วัตถุประสงค์: จัดการกลุ่มผู้ใช้งานตามหน้าที่และแผนกงาน รองรับ Nested Groups และ Inheritance
| Field | Type | Key | Description |
|---|---|---|---|
| group_id | VARCHAR(36) | PK | Group ID ในรูปแบบ UUID |
| group_name | VARCHAR(100) | UK | ชื่อกลุ่ม (unique) |
| group_arn | VARCHAR(255) | UK | Amazon Resource Name format |
| group_type | ENUM('MEDICAL','ADMINISTRATIVE','TECHNICAL','SYSTEM') | ประเภทกลุ่ม | |
| display_name | NVARCHAR(100) | ชื่อที่แสดง | |
| description | NTEXT | คำอธิบายกลุ่ม | |
| parent_group_id | VARCHAR(36) | FK | กลุ่มแม่ (self-reference) |
| department_id | VARCHAR(36) | FK | รหัสแผนก (อ้างอิง DEPARTMENTS) |
| is_system_group | BOOLEAN | เป็นกลุ่มระบบ | |
| max_users | INT | จำนวนสมาชิกสูงสุด | |
| tags | JSON | ป้ายกำกับ | |
| created_at | DATETIME | วันที่สร้าง | |
| updated_at | DATETIME | วันที่อัปเดตล่าสุด | |
| created_by | VARCHAR(36) | FK | ผู้สร้าง |
| updated_by | VARCHAR(36) | FK | ผู้อัปเดต |
| is_active | BOOLEAN | ใช้งานได้ |
Table: ROLES (บทบาท)
วัตถุประสงค์: กำหนดบทบาทและหน้าที่ที่สามารถมอบหมายให้ผู้ใช้งานหรือกลุ่ม
| Field | Type | Key | Description |
|---|---|---|---|
| role_id | VARCHAR(36) | PK | Role ID ในรูปแบบ UUID |
| role_name | VARCHAR(100) | UK | ชื่อบทบาท (unique) |
| role_arn | VARCHAR(255) | UK | Amazon Resource Name format |
| role_type | ENUM('CLINICAL','ADMINISTRATIVE','TECHNICAL','SYSTEM') | ประเภทบทบาท | |
| display_name | NVARCHAR(100) | ชื่อที่แสดง | |
| description | NTEXT | คำอธิบายบทบาท | |
| assume_role_policy | JSON | นโยบายการรับบทบาท | |
| max_session_duration | INT | ระยะเวลา Session สูงสุด (วินาทที) | |
| external_id | VARCHAR(100) | รหัสภายนอก | |
| trust_policy | JSON | นโยบายความไว้วางใจ | |
| tags | JSON | ป้ายกำกับ | |
| created_at | DATETIME | วันที่สร้าง | |
| updated_at | DATETIME | วันที่อัปเดตล่าสุด | |
| created_by | VARCHAR(36) | FK | ผู้สร้าง |
| updated_by | VARCHAR(36) | FK | ผู้อัปเดต |
| is_active | BOOLEAN | ใช้งานได้ |
Table: POLICIES (นโยบายการเข้าถึง)
วัตถุประสงค์: กำหนดนโยบายการเข้าถึงทรัพยากรต่างๆ ในระบบ ตามแนวทาง AWS IAM Policy
| Field | Type | Key | Description |
|---|---|---|---|
| policy_id | VARCHAR(36) | PK | Policy ID ในรูปแบบ UUID |
| policy_name | VARCHAR(100) | UK | ชื่อนโยบาย (unique) |
| policy_arn | VARCHAR(255) | UK | Amazon Resource Name format |
| policy_type | ENUM('MANAGED','INLINE','CUSTOM') | ประเภทนโยบาย | |
| policy_document | JSON | เอกสารนโยบายในรูปแบบ JSON | |
| version | VARCHAR(20) | เวอร์ชันนโยบาย | |
| description | NTEXT | คำอธิบายนโยบาย | |
| is_default_version | BOOLEAN | เป็นเวอร์ชันเริ่มต้น | |
| attachment_count | INT | จำนวนการแนบ | |
| tags | JSON | ป้ายกำกับ | |
| created_at | DATETIME | วันที่สร้าง | |
| updated_at | DATETIME | วันที่อัปเดตล่าสุด | |
| created_by | VARCHAR(36) | FK | ผู้สร้าง |
| updated_by | VARCHAR(36) | FK | ผู้อัปเดต |
| is_active | BOOLEAN | ใช้งานได้ |
Table: USER_GROUPS (การเป็นสมาชิกกลุ่ม)
วัตถุประสงค์: เชื่อมโยงผู้ใช้งานกับกลุ่มต่างๆ รองรับการกำหนดระยะเวลา
| Field | Type | Key | Description |
|---|---|---|---|
| user_group_id | VARCHAR(36) | PK | User Group ID ในรูปแบบ UUID |
| user_id | VARCHAR(36) | FK | รหัสผู้ใช้งาน |
| group_id | VARCHAR(36) | FK | รหัสกลุ่ม |
| joined_at | DATETIME | วันที่เข้าร่วมกลุ่ม | |
| expires_at | DATETIME | วันหมดอายุการเป็นสมาชิก | |
| assigned_by | VARCHAR(36) | FK | ผู้มอบหมาย |
| is_primary_group | BOOLEAN | เป็นกลุ่มหลัก | |
| is_active | BOOLEAN | ใช้งานได้ |
Table: USER_ROLES (การมอบหมายบทบาท)
วัตถุประสงค์: เชื่อมโยงผู้ใช้งานกับบทบาทต่างๆ รองรับการกำหนดระยะเวลาและเงื่อนไข
| Field | Type | Key | Description |
|---|---|---|---|
| user_role_id | VARCHAR(36) | PK | User Role ID ในรูปแบบ UUID |
| user_id | VARCHAR(36) | FK | รหัสผู้ใช้งาน |
| role_id | VARCHAR(36) | FK | รหัสบทบาท |
| assigned_at | DATETIME | วันที่มอบหมาย | |
| expires_at | DATETIME | วันหมดอายุ | |
| assigned_by | VARCHAR(36) | FK | ผู้มอบหมาย |
| conditions | JSON | เงื่อนไขการใช้บทบาท | |
| is_active | BOOLEAN | ใช้งานได้ |
Table: POLICY_ATTACHMENTS (การแนบนโยบาย)
วัตถุประสงค์: เชื่อมโยงนโยบายกับผู้ใช้งาน กลุ่ม หรือบทบาท
| Field | Type | Key | Description |
|---|---|---|---|
| attachment_id | VARCHAR(36) | PK | Attachment ID ในรูปแบบ UUID |
| policy_id | VARCHAR(36) | FK | รหัสนโยบาย |
| principal_type | ENUM('USER','GROUP','ROLE') | ประเภทผู้รับนโยบาย | |
| principal_id | VARCHAR(36) | รหัสผู้รับนโยบาย | |
| attached_at | DATETIME | วันที่แนบ | |
| attached_by | VARCHAR(36) | FK | ผู้แนบ |
| effective_from | DATETIME | วันที่มีผล | |
| effective_to | DATETIME | วันที่หมดอายุ | |
| conditions | JSON | เงื่อนไขการใช้งาน | |
| is_active | BOOLEAN | ใช้งานได้ |
Table: USER_SESSIONS (เซสชันผู้ใช้งาน)
วัตถุประสงค์: ติดตามและจัดการเซสชันการใช้งานของผู้ใช้
| Field | Type | Key | Description |
|---|---|---|---|
| session_id | VARCHAR(36) | PK | Session ID ในรูปแบบ UUID |
| user_id | VARCHAR(36) | FK | รหัสผู้ใช้งาน |
| session_token | VARCHAR(255) | UK | Token เซสชัน |
| login_time | DATETIME | เวลาเข้าใช้งาน | |
| last_activity | DATETIME | กิจกรรมล่าสุด | |
| expires_at | DATETIME | เวลาหมดอายุ | |
| ip_address | VARCHAR(45) | IP Address | |
| user_agent | TEXT | ข้อมูล Browser/Device | |
| login_method | ENUM('PASSWORD','MFA','SSO','API_KEY') | วิธีการเข้าใช้งาน | |
| status | ENUM('ACTIVE','EXPIRED','TERMINATED','SUSPENDED') | สถานะเซสชัน | |
| device_info | JSON | ข้อมูลอุปกรณ์ | |
| location_info | JSON | ข้อมูลตำแหน่งที่ตั้ง | |
| is_remember_me | BOOLEAN | จดจำการเข้าใช้งาน | |
| terminated_at | DATETIME | เวลาที่ยุติ | |
| terminated_by | VARCHAR(36) | FK | ผู้ยุติ |
Table: ACCESS_TOKENS (โทเค็นการเข้าถึง)
วัตถุประสงค์: จัดการ Access Token สำหรับ API และการเข้าถึงระบบ
| Field | Type | Key | Description |
|---|---|---|---|
| token_id | VARCHAR(36) | PK | Token ID ในรูปแบบ UUID |
| user_id | VARCHAR(36) | FK | รหัสผู้ใช้งาน |
| token_type | ENUM('ACCESS','REFRESH','API_KEY') | ประเภทโทเค็น | |
| token_value | VARCHAR(500) | UK | ค่าโทเค็น |
| token_hash | VARCHAR(255) | โทเค็นที่เข้ารหัส | |
| scope | VARCHAR(255) | ขอบเขตการใช้งาน | |
| issued_at | DATETIME | เวลาที่ออก | |
| expires_at | DATETIME | เวลาหมดอายุ | |
| last_used_at | DATETIME | เวลาใช้งานล่าสุด | |
| usage_count | INT | จำนวนครั้งที่ใช้ | |
| client_id | VARCHAR(100) | รหัสแอปพลิเคชัน | |
| revoked_at | DATETIME | เวลาที่ยกเลิก | |
| revoked_by | VARCHAR(36) | FK | ผู้ยกเลิก |
| is_active | BOOLEAN | ใช้งานได้ |
Table: MFA_CREDENTIALS (ข้อมูลการยืนยันตัวตนหลายปัจจัย)
วัตถุประสงค์: เก็บข้อมูลการตั้งค่า Multi-Factor Authentication
| Field | Type | Key | Description |
|---|---|---|---|
| mfa_id | VARCHAR(36) | PK | MFA ID ในรูปแบบ UUID |
| user_id | VARCHAR(36) | FK | รหัสผู้ใช้งาน |
| mfa_type | ENUM('TOTP','SMS','EMAIL','HARDWARE_KEY') | ประเภท MFA | |
| secret_key | VARCHAR(255) | Secret Key (เข้ารหัส) | |
| phone_number | VARCHAR(20) | หมายเลขโทรศัพท์ (สำหรับ SMS) | |
| VARCHAR(100) | อีเมล (สำหรับ Email OTP) | ||
| device_name | VARCHAR(100) | ชื่ออุปกรณ์ | |
| qr_code_url | VARCHAR(500) | URL QR Code | |
| backup_codes | JSON | รหัสสำรอง | |
| is_primary | BOOLEAN | เป็นวิธีหลัก | |
| verified_at | DATETIME | เวลาที่ยืนยัน | |
| last_used_at | DATETIME | เวลาใช้งานล่าสุด | |
| created_at | DATETIME | วันที่สร้าง | |
| is_active | BOOLEAN | ใช้งานได้ |
8.2.1.2 กลุ่ม System Configuration (การตั้งค่าระบบ)
Table: SYSTEM_CONFIG (การตั้งค่าระบบ)
วัตถุประสงค์: เก็บการตั้งค่าและพารามิเตอร์ต่างๆ ของระบบ รองรับการจัดกลุ่มและเวอร์ชัน
| Field | Type | Key | Description |
|---|---|---|---|
| config_id | VARCHAR(36) | PK | Config ID ในรูปแบบ UUID |
| config_group | VARCHAR(50) | กลุ่มการตั้งค่า | |
| config_key | VARCHAR(100) | คีย์การตั้งค่า | |
| config_value | TEXT | ค่าการตั้งค่า | |
| data_type | ENUM('STRING','INTEGER','BOOLEAN','JSON','DECIMAL') | ประเภทข้อมูล | |
| description | NTEXT | คำอธิบาย | |
| default_value | TEXT | ค่าเริ่มต้น | |
| is_encrypted | BOOLEAN | เข้ารหัสหรือไม่ | |
| is_editable | BOOLEAN | แก้ไขได้หรือไม่ | |
| validation_rule | TEXT | กฎการตรวจสอบ | |
| environment | VARCHAR(20) | สภาพแวดล้อม (DEV/TEST/PROD) | |
| effective_date | DATETIME | วันที่มีผล | |
| expires_at | DATETIME | วันหมดอายุ | |
| created_at | DATETIME | วันที่สร้าง | |
| updated_at | DATETIME | วันที่อัปเดตล่าสุด | |
| created_by | VARCHAR(36) | FK | ผู้สร้าง |
| updated_by | VARCHAR(36) | FK | ผู้อัปเดต |
| is_active | BOOLEAN | ใช้งานได้ |
Table: HN_VN_AN_CONFIG (การตั้งค่าหมายเลข HN/VN/AN)
วัตถุประสงค์: กำหนดรูปแบบและการสร้างหมายเลข HN, VN, AN อัตโนมัติ
| Field | Type | Key | Description |
|---|---|---|---|
| config_id | VARCHAR(36) | PK | Config ID ในรูปแบบ UUID |
| number_type | ENUM('HN','VN','AN') | ประเภทหมายเลข | |
| format_pattern | VARCHAR(50) | รูปแบบ (เช่น HN######) | |
| digit_length | INT | จำนวนหลัก | |
| prefix | VARCHAR(10) | คำนำหน้า | |
| suffix | VARCHAR(10) | คำต่อท้าย | |
| start_number | BIGINT | เลขเริ่มต้น | |
| current_number | BIGINT | เลขปัจจุบัน | |
| max_number | BIGINT | เลขสูงสุด | |
| reset_type | ENUM('NEVER','YEARLY','MONTHLY','DAILY') | การรีเซ็ต | |
| reset_value | BIGINT | ค่ารีเซ็ต | |
| auto_generate | BOOLEAN | สร้างอัตโนมัติ | |
| check_duplicate | BOOLEAN | ตรวจสอบซ้ำ | |
| department_specific | BOOLEAN | เฉพาะแผนก | |
| department_id | VARCHAR(36) | FK | รหัสแผนก |
| created_at | DATETIME | วันที่สร้าง | |
| updated_at | DATETIME | วันที่อัปเดตล่าสุด | |
| is_active | BOOLEAN | ใช้งานได้ |
Table: DEPARTMENTS (แผนกงาน)
วัตถุประสงค์: เก็บข้อมูลแผนกและหน่วยงานในโรงพยาบาล
| Field | Type | Key | Description |
|---|---|---|---|
| department_id | VARCHAR(36) | PK | Department ID ในรูปแบบ UUID |
| department_code | VARCHAR(10) | UK | รหัสแผนก |
| department_name | NVARCHAR(100) | ชื่อแผนก | |
| department_name_en | VARCHAR(100) | ชื่อแผนกภาษาอังกฤษ | |
| department_type | ENUM('CLINICAL','ADMINISTRATIVE','SUPPORT','TECHNICAL') | ประเภทแผนก | |
| parent_department_id | VARCHAR(36) | FK | แผนกแม่ |
| head_of_department | VARCHAR(36) | FK | หัวหน้าแผนก |
| phone_number | VARCHAR(20) | หมายเลขโทรศัพท์ | |
| VARCHAR(100) | อีเมลแผนก | ||
| location | NVARCHAR(100) | ที่ตั้ง | |
| floor | VARCHAR(10) | ชั้น | |
| building | NVARCHAR(50) | อาคาร | |
| is_revenue_center | BOOLEAN | เป็นศูนย์รายได้ | |
| cost_center_code | VARCHAR(20) | รหัสศูนย์ต้นทุน | |
| operating_hours | JSON | เวลาทำการ | |
| capacity | JSON | ข้อมูลความจุ | |
| equipment_list | JSON | รายการอุปกรณ์ | |
| created_at | DATETIME | วันที่สร้าง | |
| updated_at | DATETIME | วันที่อัปเดตล่าสุด | |
| created_by | VARCHAR(36) | FK | ผู้สร้าง |
| updated_by | VARCHAR(36) | FK | ผู้อัปเดต |
| is_active | BOOLEAN | ใช้งานได้ |
Table: MASTER_DATA_CATEGORIES (หมวดหมู่ข้อมูลพื้นฐาน)
วัตถุประสงค์: จัดกลุ่มข้อมูลพื้นฐานต่างๆ ของระบบ
| Field | Type | Key | Description |
|---|---|---|---|
| category_id | VARCHAR(36) | PK | Category ID ในรูปแบบ UUID |
| category_code | VARCHAR(20) | UK | รหัสหมวดหมู่ |
| category_name | NVARCHAR(100) | ชื่อหมวดหมู่ | |
| category_name_en | VARCHAR(100) | ชื่อหมวดหมู่ภาษาอังกฤษ | |
| description | NTEXT | คำอธิบาย | |
| parent_category_id | VARCHAR(36) | FK | หมวดหมู่แม่ |
| data_source | VARCHAR(50) | แหล่งข้อมูล | |
| update_frequency | ENUM('STATIC','DAILY','WEEKLY','MONTHLY','YEARLY') | ความถี่การอัปเดต | |
| validation_rules | JSON | กฎการตรวจสอบ | |
| sort_order | INT | ลำดับการเรียง | |
| created_at | DATETIME | วันที่สร้าง | |
| updated_at | DATETIME | วันที่อัปเดตล่าสุด | |
| created_by | VARCHAR(36) | FK | ผู้สร้าง |
| updated_by | VARCHAR(36) | FK | ผู้อัปเดต |
| is_active | BOOLEAN | ใช้งานได้ |
Table: MASTER_DATA_ITEMS (รายการข้อมูลพื้นฐาน)
วัตถุประสงค์: เก็บรายการข้อมูลพื้นฐานทั้งหมดของระบบ
| Field | Type | Key | Description |
|---|---|---|---|
| item_id | VARCHAR(36) | PK | Item ID ในรูปแบบ UUID |
| category_id | VARCHAR(36) | FK | รหัสหมวดหมู่ |
| item_code | VARCHAR(20) | รหัสรายการ | |
| item_name | NVARCHAR(200) | ชื่อรายการ | |
| item_name_en | VARCHAR(200) | ชื่อรายการภาษาอังกฤษ | |
| short_name | NVARCHAR(50) | ชื่อย่อ | |
| description | NTEXT | คำอธิบาย | |
| external_code | VARCHAR(50) | รหัสภายนอก | |
| parent_item_id | VARCHAR(36) | FK | รายการแม่ |
| sort_order | INT | ลำดับการเรียง | |
| attributes | JSON | คุณลักษณะเพิ่มเติม | |
| is_default | BOOLEAN | เป็นค่าเริ่มต้น | |
| effective_from | DATE | วันที่มีผล | |
| effective_to | DATE | วันที่หมดอายุ | |
| created_at | DATETIME | วันที่สร้าง | |
| updated_at | DATETIME | วันที่อัปเดตล่าสุด | |
| created_by | VARCHAR(36) | FK | ผู้สร้าง |
| updated_by | VARCHAR(36) | FK | ผู้อัปเดต |
| is_active | BOOLEAN | ใช้งานได้ |
Table: DATABASE_CONFIG (การตั้งค่าฐานข้อมูล)
วัตถุประสงค์: เก็บการตั้งค่าการเชื่อมต่อฐานข้อมูล MySQL และ PostgreSQL
| Field | Type | Key | Description |
|---|---|---|---|
| db_config_id | VARCHAR(36) | PK | DB Config ID ในรูปแบบ UUID |
| connection_name | VARCHAR(100) | UK | ชื่อการเชื่อมต่อ |
| database_type | ENUM('MYSQL','POSTGRESQL','MSSQL','ORACLE') | ประเภทฐานข้อมูล | |
| host | VARCHAR(100) | Host Server | |
| port | INT | Port | |
| database_name | VARCHAR(100) | ชื่อฐานข้อมูล | |
| username | VARCHAR(100) | ชื่อผู้ใช้ฐานข้อมูล | |
| password_encrypted | VARCHAR(500) | รหัสผ่านที่เข้ารหัส | |
| connection_string | TEXT | Connection String เต็ม | |
| max_connections | INT | จำนวนการเชื่อมต่อสูงสุด | |
| connection_timeout | INT | Timeout การเชื่อมต่อ (วินาทที) | |
| charset | VARCHAR(20) | Character Set | |
| collation | VARCHAR(50) | Collation | |
| ssl_enabled | BOOLEAN | เปิดใช้ SSL | |
| ssl_certificate | TEXT | SSL Certificate | |
| is_primary | BOOLEAN | เป็นฐานข้อมูลหลัก | |
| is_read_only | BOOLEAN | อ่านอย่างเดียว | |
| backup_enabled | BOOLEAN | เปิดการสำรอง | |
| environment | VARCHAR(20) | สภาพแวดล้อม | |
| connection_pool_config | JSON | การตั้งค่า Connection Pool | |
| created_at | DATETIME | วันที่สร้าง | |
| updated_at | DATETIME | วันที่อัปเดตล่าสุด | |
| last_tested_at | DATETIME | เวลาทดสอบล่าสุด | |
| is_active | BOOLEAN | ใช้งานได้ |
Table: BACKUP_JOBS (งานสำรองข้อมูล)
วัตถุประสงค์: กำหนดและติดตามงานสำรองข้อมูลอัตโนมัติ
| Field | Type | Key | Description |
|---|---|---|---|
| job_id | VARCHAR(36) | PK | Job ID ในรูปแบบ UUID |
| job_name | VARCHAR(100) | UK | ชื่องาน |
| database_config_id | VARCHAR(36) | FK | รหัสการตั้งค่าฐานข้อมูล |
| backup_type | ENUM('FULL','INCREMENTAL','DIFFERENTIAL','LOG') | ประเภทการสำรอง | |
| schedule_type | ENUM('DAILY','WEEKLY','MONTHLY','CUSTOM') | ประเภทตารางเวลา | |
| schedule_expression | VARCHAR(100) | Cron Expression | |
| backup_path | VARCHAR(500) | พาธสำรอง | |
| retention_days | INT | จำนวนวันเก็บไฟล์สำรอง | |
| compression_enabled | BOOLEAN | บีบอัดไฟล์ | |
| encryption_enabled | BOOLEAN | เข้ารหัสไฟล์ | |
| notification_email | VARCHAR(500) | อีเมลแจ้งเตือน | |
| pre_backup_script | TEXT | Script ก่อนสำรอง | |
| post_backup_script | TEXT | Script หลังสำรอง | |
| max_execution_time | INT | เวลาดำเนินการสูงสุด (นาที) | |
| priority | ENUM('LOW','NORMAL','HIGH','CRITICAL') | ลำดับความสำคัญ | |
| is_enabled | BOOLEAN | เปิดใช้งาน | |
| last_run_at | DATETIME | เวลาทำงานล่าสุด | |
| next_run_at | DATETIME | เวลาทำงานครั้งถัดไป | |
| created_at | DATETIME | วันที่สร้าง | |
| updated_at | DATETIME | วันที่อัปเดตล่าสุด | |
| created_by | VARCHAR(36) | FK | ผู้สร้าง |
| is_active | BOOLEAN | ใช้งานได้ |
8.2.1.3 กลุ่ม Communication & Monitoring (การสื่อสารและติดตาม)
Table: NEWS_ANNOUNCEMENTS (ประกาศข่าว)
วัตถุประสงค์: จัดการประกาศข่าวและการสื่อสารภายในองค์กร
| Field | Type | Key | Description |
|---|---|---|---|
| announcement_id | VARCHAR(36) | PK | Announcement ID ในรูปแบบ UUID |
| title | NVARCHAR(200) | หัวข้อประกาศ | |
| content | NTEXT | เนื้อหาประกาศ | |
| announcement_type | ENUM('NEWS','POLICY','URGENT','MAINTENANCE','TRAINING') | ประเภทประกาศ | |
| priority | ENUM('LOW','NORMAL','HIGH','CRITICAL') | ระดับความสำคัญ | |
| target_audience | ENUM('ALL','DEPARTMENT','GROUP','ROLE','SPECIFIC') | กลุ่มเป้าหมาย | |
| target_details | JSON | รายละเอียดกลุ่มเป้าหมาย | |
| publish_date | DATETIME | วันที่เผยแพร่ | |
| expire_date | DATETIME | วันหมดอายุ | |
| is_popup | BOOLEAN | แสดงเป็น Popup | |
| is_email_notification | BOOLEAN | ส่งอีเมลแจ้งเตือน | |
| is_sms_notification | BOOLEAN | ส่ง SMS แจ้งเตือน | |
| attachment_files | JSON | ไฟล์แนบ | |
| read_acknowledgement | BOOLEAN | ต้องยืนยันการอ่าน | |
| view_count | INT | จำนวนผู้อ่าน | |
| author_id | VARCHAR(36) | FK | ผู้เขียน |
| approved_by | VARCHAR(36) | FK | ผู้อนุมัติ |
| approved_at | DATETIME | วันที่อนุมัติ | |
| created_at | DATETIME | วันที่สร้าง | |
| updated_at | DATETIME | วันที่อัปเดตล่าสุด | |
| is_active | BOOLEAN | ใช้งานได้ |
Table: NOTIFICATIONS (การแจ้งเตือน)
วัตถุประสงค์: จัดการการแจ้งเตือนต่างๆ ในระบบ
| Field | Type | Key | Description |
|---|---|---|---|
| notification_id | VARCHAR(36) | PK | Notification ID ในรูปแบบ UUID |
| recipient_id | VARCHAR(36) | FK | ผู้รับ |
| recipient_type | ENUM('USER','GROUP','ROLE','DEPARTMENT') | ประเภทผู้รับ | |
| notification_type | ENUM('SYSTEM','MEDICAL','FINANCIAL','ADMINISTRATIVE') | ประเภทการแจ้งเตือน | |
| category | VARCHAR(50) | หมวดหมู่ | |
| title | NVARCHAR(200) | หัวข้อ | |
| message | NTEXT | ข้อความ | |
| data_payload | JSON | ข้อมูลเพิ่มเติม | |
| delivery_method | ENUM('IN_APP','EMAIL','SMS','PUSH') | วิธีการส่ง | |
| priority | ENUM('LOW','NORMAL','HIGH','CRITICAL') | ระดับความสำคัญ | |
| is_read | BOOLEAN | อ่านแล้ว | |
| read_at | DATETIME | เวลาที่อ่าน | |
| is_actionable | BOOLEAN | ต้องดำเนินการ | |
| action_url | VARCHAR(500) | URL สำหรับดำเนินการ | |
| action_taken_at | DATETIME | เวลาที่ดำเนินการ | |
| expires_at | DATETIME | วันหมดอายุ | |
| source_system | VARCHAR(50) | ระบบต้นทาง | |
| source_reference | VARCHAR(100) | อ้างอิงต้นทาง | |
| created_at | DATETIME | วันที่สร้าง | |
| delivered_at | DATETIME | เวลาที่ส่ง | |
| is_active | BOOLEAN | ใช้งานได้ |
Table: USER_ACTIVITY_LOG (บันทึกกิจกรรมผู้ใช้)
วัตถุประสงค์: ติดตามและบันทึกกิจกรรมการใช้งานของผู้ใช้
| Field | Type | Key | Description |
|---|---|---|---|
| activity_id | VARCHAR(36) | PK | Activity ID ในรูปแบบ UUID |
| user_id | VARCHAR(36) | FK | รหัสผู้ใช้งาน |
| session_id | VARCHAR(36) | FK | รหัสเซสชัน |
| activity_timestamp | DATETIME | เวลากิจกรรม | |
| activity_type | ENUM('LOGIN','LOGOUT','PAGE_VIEW','ACTION','ERROR') | ประเภทกิจกรรม | |
| module | VARCHAR(50) | โมดูลที่ใช้งาน | |
| action | VARCHAR(100) | การกระทำ | |
| resource | VARCHAR(200) | ทรัพยากรที่เข้าถึง | |
| ip_address | VARCHAR(45) | IP Address | |
| user_agent | TEXT | ข้อมูล Browser/Device | |
| request_url | VARCHAR(500) | URL ที่เข้าถึง | |
| request_method | VARCHAR(10) | HTTP Method | |
| response_status | INT | HTTP Status Code | |
| response_time | INT | เวลาตอบสนอง (มิลลิวินาทที) | |
| parameters | JSON | พารามิเตอร์ที่ส่ง | |
| error_message | TEXT | ข้อความข้อผิดพลาด | |
| geolocation | JSON | ข้อมูลตำแหน่งที่ตั้ง | |
| device_fingerprint | VARCHAR(255) | ลายนิ้วมืออุปกรณ์ |
Table: AUDIT_TRAIL (บันทึกการตรวจสอบ)
วัตถุประสงค์: บันทึกการเปลี่ยนแปลงข้อมูลสำคัญเพื่อการตรวจสอบ
| Field | Type | Key | Description |
|---|---|---|---|
| audit_id | VARCHAR(36) | PK | Audit ID ในรูปแบบ UUID |
| table_name | VARCHAR(100) | ชื่อตาราง | |
| record_id | VARCHAR(36) | รหัสระเบียน | |
| operation | ENUM('INSERT','UPDATE','DELETE','SELECT') | การดำเนินการ | |
| user_id | VARCHAR(36) | FK | ผู้ดำเนินการ |
| session_id | VARCHAR(36) | FK | รหัสเซสชัน |
| event_timestamp | DATETIME | เวลาเหตุการณ์ | |
| ip_address | VARCHAR(45) | IP Address | |
| old_values | JSON | ค่าเดิม | |
| new_values | JSON | ค่าใหม่ | |
| changed_fields | JSON | ฟิลด์ที่เปลี่ยน | |
| business_context | VARCHAR(200) | บริบททางธุรกิจ | |
| risk_level | ENUM('LOW','MEDIUM','HIGH','CRITICAL') | ระดับความเสี่ยง | |
| compliance_tags | JSON | ป้ายกำกับการปฏิบัติตามกฎ | |
| retention_date | DATE | วันที่ลบข้อมูล |
8.2.1.4 กลุ่ม Reporting & Analytics (รายงานและการวิเคราะห์)
Table: REPORT_TEMPLATES (เทมเพลตรายงาน)
วัตถุประสงค์: เก็บเทมเพลตและการตั้งค่ารายงานต่างๆ
| Field | Type | Key | Description |
|---|---|---|---|
| template_id | VARCHAR(36) | PK | Template ID ในรูปแบบ UUID |
| template_name | VARCHAR(100) | UK | ชื่อเทมเพลต |
| template_code | VARCHAR(50) | UK | รหัสเทมเพลต |
| category | VARCHAR(50) | หมวดหมู่รายงาน | |
| description | NTEXT | คำอธิบาย | |
| report_type | ENUM('TABULAR','CHART','DASHBOARD','DOCUMENT') | ประเภทรายงาน | |
| data_source | VARCHAR(100) | แหล่งข้อมูล | |
| query_definition | TEXT | คำสั่ง SQL หรือ Query | |
| layout_definition | JSON | การกำหนดเลย์เอาต์ | |
| parameters | JSON | พารามิเตอร์รายงาน | |
| chart_config | JSON | การตั้งค่าแผนภูมิ | |
| export_formats | JSON | รูปแบบการส่งออก | |
| access_permissions | JSON | สิทธิ์การเข้าถึง | |
| is_public | BOOLEAN | เป็นรายงานสาธารณะ | |
| is_system_template | BOOLEAN | เป็นเทมเพลตระบบ | |
| usage_count | INT | จำนวนครั้งที่ใช้ | |
| created_at | DATETIME | วันที่สร้าง | |
| updated_at | DATETIME | วันที่อัปเดตล่าสุด | |
| created_by | VARCHAR(36) | FK | ผู้สร้าง |
| updated_by | VARCHAR(36) | FK | ผู้อัปเดต |
| is_active | BOOLEAN | ใช้งานได้ |
Table: REPORT_INSTANCES (อินสแตนซ์รายงาน)
วัตถุประสงค์: เก็บรายงานที่สร้างและประวัติการสร้าง
| Field | Type | Key | Description |
|---|---|---|---|
| instance_id | VARCHAR(36) | PK | Instance ID ในรูปแบบ UUID |
| template_id | VARCHAR(36) | FK | รหัสเทมเพลต |
| instance_name | VARCHAR(100) | ชื่ออินสแตนซ์ | |
| generated_by | VARCHAR(36) | FK | ผู้สร้างรายงาน |
| generated_at | DATETIME | เวลาที่สร้าง | |
| parameters_used | JSON | พารามิเตอร์ที่ใช้ | |
| data_range | JSON | ช่วงข้อมูล | |
| file_path | VARCHAR(500) | พาธไฟล์รายงาน | |
| file_format | VARCHAR(20) | รูปแบบไฟล์ | |
| file_size | BIGINT | ขนาดไฟล์ (bytes) | |
| generation_time | INT | เวลาที่ใช้สร้าง (วินาทที) | |
| record_count | INT | จำนวนระเบียน | |
| status | ENUM('GENERATING','COMPLETED','FAILED','EXPIRED') | สถานะ | |
| error_message | TEXT | ข้อความข้อผิดพลาด | |
| download_count | INT | จำนวนครั้งที่ดาวน์โหลด | |
| expires_at | DATETIME | วันหมดอายุ | |
| is_scheduled | BOOLEAN | เป็นรายงานตามกำหนดเวลา | |
| schedule_id | VARCHAR(36) | FK | รหัสตารางเวลา |
8.2.1.5 กลุ่ม Integration & API (การเชื่อมโยงและ API)
Table: HIS_SYSTEMS (ระบบ HIS)
วัตถุประสงค์: เก็บข้อมูลระบบ HIS ทั้งหมดที่เชื่อมโยงกัน
| Field | Type | Key | Description |
|---|---|---|---|
| system_id | VARCHAR(36) | PK | System ID ในรูปแบบ UUID |
| system_code | VARCHAR(20) | UK | รหัสระบบ (เช่น 1.2.1, 1.2.2) |
| system_name | NVARCHAR(100) | ชื่อระบบ | |
| system_name_en | VARCHAR(100) | ชื่อระบบภาษาอังกฤษ | |
| description | NTEXT | คำอธิบายระบบ | |
| version | VARCHAR(20) | เวอร์ชันระบบ | |
| vendor | NVARCHAR(100) | ผู้จำหน่าย | |
| system_type | ENUM('CORE','MODULE','EXTERNAL','API') | ประเภทระบบ | |
| base_url | VARCHAR(500) | URL หลัก | |
| api_version | VARCHAR(20) | เวอร์ชัน API | |
| authentication_type | ENUM('NONE','BASIC','BEARER','OAUTH','API_KEY') | ประเภทการยืนยันตัวตน | |
| api_key | VARCHAR(500) | API Key (เข้ารหัส) | |
| connection_status | ENUM('CONNECTED','DISCONNECTED','ERROR','MAINTENANCE') | สถานะการเชื่อมต่อ | |
| last_health_check | DATETIME | เวลาตรวจสอบล่าสุด | |
| health_check_interval | INT | ช่วงเวลาตรวจสอบ (นาที) | |
| timeout_seconds | INT | Timeout การเชื่อมต่อ | |
| retry_attempts | INT | จำนวนครั้งลองใหม่ | |
| is_critical | BOOLEAN | เป็นระบบที่สำคัญ | |
| maintenance_window | JSON | ช่วงเวลาบำรุงรักษา | |
| contact_person | NVARCHAR(100) | ผู้ติดต่อ | |
| contact_email | VARCHAR(100) | อีเมลติดต่อ | |
| contact_phone | VARCHAR(20) | โทรศัพท์ติดต่อ | |
| created_at | DATETIME | วันที่สร้าง | |
| updated_at | DATETIME | วันที่อัปเดตล่าสุด | |
| is_active | BOOLEAN | ใช้งานได้ |
Table: API_ENDPOINTS (API Endpoints)
วัตถุประสงค์: เก็บข้อมูล API Endpoints ต่างๆ ของระบบ
| Field | Type | Key | Description |
|---|---|---|---|
| endpoint_id | VARCHAR(36) | PK | Endpoint ID ในรูปแบบ UUID |
| system_id | VARCHAR(36) | FK | รหัสระบบ |
| endpoint_name | VARCHAR(100) | ชื่อ Endpoint | |
| endpoint_path | VARCHAR(500) | Path ของ Endpoint | |
| http_method | ENUM('GET','POST','PUT','DELETE','PATCH') | HTTP Method | |
| description | NTEXT | คำอธิบาย | |
| request_format | ENUM('JSON','XML','FORM_DATA','QUERY_STRING') | รูปแบบ Request | |
| response_format | ENUM('JSON','XML','TEXT','BINARY') | รูปแบบ Response | |
| authentication_required | BOOLEAN | ต้องยืนยันตัวตน | |
| rate_limit | INT | จำกัดการเรียกใช้ (ต่อนาที) | |
| cache_duration | INT | ระยะเวลา Cache (วินาที) | |
| request_schema | JSON | Schema ของ Request | |
| response_schema | JSON | Schema ของ Response | |
| error_codes | JSON | รหัสข้อผิดพลาด | |
| is_deprecated | BOOLEAN | เลิกใช้แล้ว | |
| deprecated_date | DATE | วันที่เลิกใช้ | |
| replacement_endpoint | VARCHAR(36) | FK | Endpoint ที่มาแทนที่ |
| documentation_url | VARCHAR(500) | URL เอกสาร | |
| test_data | JSON | ข้อมูลทดสอบ | |
| created_at | DATETIME | วันที่สร้าง | |
| updated_at | DATETIME | วันที่อัปเดตล่าสุด | |
| is_active | BOOLEAN | ใช้งานได้ |
8.2.2 ตารางรองรับการทำงาน (Support Tables)
8.2.2.1 ตารางประวัติและการติดตาม
Table: PASSWORD_HISTORY (ประวัติรหัสผ่าน)
วัตถุประสงค์: เก็บประวัติรหัสผ่านเพื่อป้องกันการใช้รหัสผ่านเดิมซ้ำ
| Field | Type | Key | Description |
|---|---|---|---|
| history_id | VARCHAR(36) | PK | History ID ในรูปแบบ UUID |
| user_id | VARCHAR(36) | FK | รหัสผู้ใช้งาน |
| password_hash | VARCHAR(255) | รหัสผ่านที่เข้ารหัส | |
| created_at | DATETIME | วันที่สร้าง | |
| salt | VARCHAR(100) | Salt สำหรับเข้ารหัส | |
| hash_algorithm | VARCHAR(50) | Algorithm ที่ใช้เข้ารหัส |
Table: BACKUP_HISTORY (ประวัติการสำรองข้อมูล)
วัตถุประสงค์: บันทึกประวัติการทำงานของงานสำรองข้อมูล
| Field | Type | Key | Description |
|---|---|---|---|
| backup_id | VARCHAR(36) | PK | Backup ID ในรูปแบบ UUID |
| job_id | VARCHAR(36) | FK | รหัสงานสำรอง |
| start_time | DATETIME | เวลาเริ่มต้น | |
| end_time | DATETIME | เวลาสิ้นสุด | |
| duration_seconds | INT | ระยะเวลา (วินาที) | |
| status | ENUM('RUNNING','COMPLETED','FAILED','CANCELLED') | สถานะ | |
| backup_file_path | VARCHAR(500) | พาธไฟล์สำรอง | |
| file_size_bytes | BIGINT | ขนาดไฟล์ (bytes) | |
| records_processed | BIGINT | จำนวนระเบียนที่ประมวลผล | |
| error_message | TEXT | ข้อความข้อผิดพลาด | |
| compression_ratio | DECIMAL(5,2) | อัตราการบีบอัด | |
| checksum | VARCHAR(255) | Checksum ไฟล์ | |
| backup_method | ENUM('FULL','INCREMENTAL','DIFFERENTIAL') | วิธีการสำรอง | |
| triggered_by | ENUM('SCHEDULE','MANUAL','SYSTEM') | ผู้/สิ่งที่เรียกใช้ | |
| triggered_user | VARCHAR(36) | FK | ผู้ใช้ที่เรียกใช้ (กรณี Manual) |
Table: SYSTEM_LOGS (บันทึกระบบ)
วัตถุประสงค์: บันทึกเหตุการณ์และข้อผิดพลาดของระบบ
| Field | Type | Key | Description |
|---|---|---|---|
| log_id | VARCHAR(36) | PK | Log ID ในรูปแบบ UUID |
| log_level | ENUM('DEBUG','INFO','WARN','ERROR','FATAL') | ระดับ Log | |
| timestamp | DATETIME | เวลาเหตุการณ์ | |
| source | VARCHAR(100) | แหล่งที่มา | |
| category | VARCHAR(50) | หมวดหมู่ | |
| message | TEXT | ข้อความ | |
| details | JSON | รายละเอียดเพิ่มเติม | |
| user_id | VARCHAR(36) | FK | ผู้ใช้ที่เกี่ยวข้อง |
| session_id | VARCHAR(36) | FK | Session ที่เกี่ยวข้อง |
| ip_address | VARCHAR(45) | IP Address | |
| exception_trace | TEXT | Stack Trace | |
| correlation_id | VARCHAR(36) | ID สำหรับติดตาม |
Table: INTEGRATION_LOGS (บันทึกการเชื่อมโยง)
วัตถุประสงค์: บันทึกการเรียกใช้ API และการเชื่อมโยงระบบ
| Field | Type | Key | Description |
|---|---|---|---|
| integration_log_id | VARCHAR(36) | PK | Integration Log ID ในรูปแบบ UUID |
| system_id | VARCHAR(36) | FK | รหัสระบบต้นทาง |
| endpoint_id | VARCHAR(36) | FK | รหัส Endpoint |
| request_timestamp | DATETIME | เวลาส่ง Request | |
| response_timestamp | DATETIME | เวลาได้รับ Response | |
| response_time_ms | INT | เวลาตอบสนอง (มิลลิวินาที) | |
| http_method | VARCHAR(10) | HTTP Method | |
| request_url | VARCHAR(500) | URL ที่เรียก | |
| request_headers | JSON | Headers ของ Request | |
| request_body | TEXT | Body ของ Request | |
| response_status | INT | HTTP Status Code | |
| response_headers | JSON | Headers ของ Response | |
| response_body | TEXT | Body ของ Response | |
| error_message | TEXT | ข้อความข้อผิดพลาด | |
| retry_count | INT | จำนวนครั้งที่ลองใหม่ | |
| user_id | VARCHAR(36) | FK | ผู้ใช้ที่เรียกใช้ |
| correlation_id | VARCHAR(36) | ID สำหรับติดตาม | |
| business_context | VARCHAR(200) | บริบททางธุรกิจ |
8.2.3 ข้อมูลจำเพาะของฟิลด์และ Constraints
8.2.3.1 Primary Keys และ Foreign Keys
8.2.3.1.1 รูปแบบ Primary Key
- ทุกตาราง: ใช้ UUID (Universally Unique Identifier) format
- ความยาว: 36 ตัวอักษร รวมเครื่องหมาย hyphen
- ตัวอย่าง:
550e8400-e29b-41d4-a716-446655440000 - ข้อดี: ไม่ซ้ำกันทั่วโลก, เหมาะสำหรับระบบกระจาย, ปลอดภัยกว่า Auto-increment
8.2.3.1.2 การตั้งชื่อ Foreign Key
- รูปแบบ:
{table_name}_id - ตัวอย่าง:
user_idสำหรับอ้างอิง USERS tablegroup_idสำหรับอ้างอิง GROUPS tabledepartment_idสำหรับอ้างอิง DEPARTMENTS table
8.2.3.2 Unique Constraints
-- USERS table
ALTER TABLE USERS ADD CONSTRAINT uk_users_username UNIQUE (username);
ALTER TABLE USERS ADD CONSTRAINT uk_users_email UNIQUE (email);
ALTER TABLE USERS ADD CONSTRAINT uk_users_arn UNIQUE (user_arn);
-- GROUPS table
ALTER TABLE GROUPS ADD CONSTRAINT uk_groups_name UNIQUE (group_name);
ALTER TABLE GROUPS ADD CONSTRAINT uk_groups_arn UNIQUE (group_arn);
-- ROLES table
ALTER TABLE ROLES ADD CONSTRAINT uk_roles_name UNIQUE (role_name);
ALTER TABLE ROLES ADD CONSTRAINT uk_roles_arn UNIQUE (role_arn);
-- POLICIES table
ALTER TABLE POLICIES ADD CONSTRAINT uk_policies_name UNIQUE (policy_name);
ALTER TABLE POLICIES ADD CONSTRAINT uk_policies_arn UNIQUE (policy_arn);
8.2.3.3 Check Constraints
-- USERS table
ALTER TABLE USERS ADD CONSTRAINT chk_users_status
CHECK (status IN ('ACTIVE','INACTIVE','SUSPENDED','LOCKED','EXPIRED'));
ALTER TABLE USERS ADD CONSTRAINT chk_users_email_format
CHECK (email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$');
-- USER_SESSIONS table
ALTER TABLE USER_SESSIONS ADD CONSTRAINT chk_session_expires
CHECK (expires_at > login_time);
-- SYSTEM_CONFIG table
ALTER TABLE SYSTEM_CONFIG ADD CONSTRAINT chk_config_data_type
CHECK (data_type IN ('STRING','INTEGER','BOOLEAN','JSON','DECIMAL'));
8.2.3.4 JSON Field Structures
8.2.3.4.1 User Preferences Structure
{
"theme": "light|dark",
"language": "th|en",
"timezone": "Asia/Bangkok",
"date_format": "DD/MM/YYYY|MM/DD/YYYY",
"time_format": "24|12",
"page_size": 25,
"auto_logout": 480,
"notification_settings": {
"email": true,
"sms": false,
"in_app": true,
"push": true
},
"dashboard_layout": {...},
"menu_preferences": {...}
}
8.2.3.4.2 Policy Document (AWS IAM Style)
{
"Version": "2024-10-07",
"Statement": [
{
"Sid": "AllowPatientRead",
"Effect": "Allow",
"Action": [
"patient:Read",
"patient:List"
],
"Resource": "arn:hospital:patient:*",
"Condition": {
"StringEquals": {
"department": "${user:department}"
}
}
}
]
}
8.2.4 ดัชนี (Indexes) และการปรับปรุงประสิทธิภาพ
8.2.4.1 Primary Indexes
-- Identity & Access Management
CREATE UNIQUE INDEX idx_users_username ON USERS(username);
CREATE UNIQUE INDEX idx_users_email ON USERS(email);
CREATE INDEX idx_users_department ON USERS(department_id);
CREATE INDEX idx_users_status ON USERS(status);
CREATE INDEX idx_users_last_login ON USERS(last_login_at);
-- Session Management
CREATE UNIQUE INDEX idx_sessions_token ON USER_SESSIONS(session_token);
CREATE INDEX idx_sessions_user ON USER_SESSIONS(user_id);
CREATE INDEX idx_sessions_status ON USER_SESSIONS(status);
CREATE INDEX idx_sessions_expires ON USER_SESSIONS(expires_at);
-- Audit and Monitoring
CREATE INDEX idx_audit_user ON AUDIT_TRAIL(user_id);
CREATE INDEX idx_audit_table ON AUDIT_TRAIL(table_name);
CREATE INDEX idx_audit_timestamp ON AUDIT_TRAIL(event_timestamp);
CREATE INDEX idx_activity_user_time ON USER_ACTIVITY_LOG(user_id, activity_timestamp);
8.2.4.2 Composite Indexes
-- User-Group membership with date range
CREATE INDEX idx_user_groups_active ON USER_GROUPS(user_id, group_id, joined_at, expires_at);
-- User-Role assignment with date range
CREATE INDEX idx_user_roles_active ON USER_ROLES(user_id, role_id, assigned_at, expires_at);
-- Policy attachments by principal
CREATE INDEX idx_policy_attach_principal ON POLICY_ATTACHMENTS(principal_type, principal_id, policy_id);
-- System configuration by group and environment
CREATE INDEX idx_config_group_env ON SYSTEM_CONFIG(config_group, environment, config_key);
8.2.5 ข้อกำหนดด้านความปลอดภัย (Security Requirements)
8.2.5.1 Data Encryption
8.2.5.1.1 Fields ที่ต้องเข้ารหัส
-- Passwords and secrets
USERS.password_hash -- bcrypt with cost factor 12+
MFA_CREDENTIALS.secret_key -- AES-256-GCM
ACCESS_TOKENS.token_value -- AES-256-GCM
DATABASE_CONFIG.password_encrypted -- AES-256-GCM
HIS_SYSTEMS.api_key -- AES-256-GCM
8.2.5.1.2 Encryption Standards
- Symmetric Encryption: AES-256-GCM
- Password Hashing: bcrypt with cost factor 12+
- Key Derivation: PBKDF2 with 100,000+ iterations
- Token Signing: RS256 (RSA-SHA256)
8.2.5.2 Row-Level Security (RLS)
-- Users can only see their own sessions
CREATE POLICY user_sessions_policy ON USER_SESSIONS
FOR ALL TO application_role
USING (user_id = current_user_id());
-- Department admins can only see their department users
CREATE POLICY dept_users_policy ON USERS
FOR ALL TO dept_admin_role
USING (department_id = current_user_department());
-- Audit trail access based on clearance level
CREATE POLICY audit_access_policy ON AUDIT_TRAIL
FOR SELECT TO audit_role
USING (risk_level <= current_user_clearance());
8.2.5.3 Data Retention และ Purging
8.2.5.3.1 Retention Policies
- AUDIT_TRAIL: เก็บ 7 ปี (ตามกฎหมาย)
- USER_ACTIVITY_LOG: เก็บ 3 ปี
- USER_SESSIONS: ลบอัตโนมัติเมื่อหมดอายุ
- PASSWORD_HISTORY: เก็บ 12 รุ่นล่าสุด
- SYSTEM_LOGS: เก็บ 1 ปี
- INTEGRATION_LOGS: เก็บ 6 เดือน
8.2.5.3.2 Automated Purging Jobs
-- สร้างงานลบข้อมูลเก่าอัตโนมัติ
CREATE EVENT purge_expired_sessions
ON SCHEDULE EVERY 1 HOUR
DO DELETE FROM USER_SESSIONS WHERE expires_at < NOW();
CREATE EVENT purge_old_logs
ON SCHEDULE EVERY 1 DAY
DO DELETE FROM SYSTEM_LOGS WHERE timestamp < DATE_SUB(NOW(), INTERVAL 1 YEAR);
CREATE EVENT purge_old_password_history
ON SCHEDULE EVERY 1 WEEK
DO DELETE FROM PASSWORD_HISTORY
WHERE history_id NOT IN (
SELECT history_id FROM (
SELECT history_id FROM PASSWORD_HISTORY
WHERE user_id = p.user_id
ORDER BY created_at DESC LIMIT 12
) AS recent
);
สรุป
เอกสาร Schema ระบบผู้ดูแลระบบนี้ได้ออกแบบตามแนวทาง AWS IAM เพื่อให้มีความปลอดภัยสูงและสามารถจัดการสิทธิ์การเข้าถึงได้อย่างละเอียด รองรับการทำงานของระบบ HIS ทั้งหมดในโรงพยาบาลค่ายธนรัชน์ โดยครอบคลุม:
- Identity and Access Management - การจัดการผู้ใช้งาน กลุ่ม บทบาท และนโยบาย
- System Configuration - การตั้งค่าระบบและข้อมูลพื้นฐาน
- Communication & Monitoring - การสื่อสารและติดตามการใช้งาน
- Reporting & Analytics - การจัดการรายงานและการวิเคราะห์
- Integration & API - การเชื่อมโยงกับระบบอื่น
ระบบนี้จะทำหน้าที่เป็นศูนย์กลางการควบคุมและจัดการระบบ HIS ทั้งหมด เพื่อให้การดำเนินงานของโรงพยาบาลเป็นไปอย่างมีประสิทธิภาพและปลอดภัย
Data Validation Rules และ Business Constraints
1. การตรวจสอบรูปแบบข้อมูล (Data Format Validation)
1.1 HN (Hospital Number) Format
-- ใน HN_VN_AN_CONFIG table
format_pattern: "TN{YYYYMM}{NNNNNN}"
validation_regex: "^TN[0-9]{4}(0[1-9]|1[0-2])[0-9]{6}$"
min_length: 12
max_length: 12
example: "TN20250112345678"
description: "TN + ปีเดือน(YYYYMM) + หมายเลขลำดับ 6 หลัก"
1.2 VN (Visit Number) Format
format_pattern: "VN{YYYYMMDD}{NNNNN}"
validation_regex: "^VN[0-9]{8}[0-9]{5}$"
min_length: 13
max_length: 13
example: "VN2025010812345"
description: "VN + วันที่(YYYYMMDD) + หมายเลขลำดับ 5 หลัก"
1.3 AN (Admission Number) Format
format_pattern: "AN{YYYYMMDD}{NNNN}"
validation_regex: "^AN[0-9]{8}[0-9]{4}$"
min_length: 12
max_length: 12
example: "AN202501081234"
description: "AN + วันที่(YYYYMMDD) + หมายเลขลำดับ 4 หลัก"
2. Password Policy และ Security Rules
2.1 Password Requirements
-- ใน USERS table
password_policy:
min_length: 12
max_length: 128
require_uppercase: true
require_lowercase: true
require_numbers: true
require_special_chars: true
special_chars_allowed: "!@#$%^&*()_+-=[]{}|;:,.<>?"
disallow_username: true
disallow_common_passwords: true
password_history_check: 12 # ห้ามใช้รหัสผ่าน 12 ครั้งล่าสุด
validation_regex: "^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{12,128}$"
2.2 Session Token Rules
-- ใน ACCESS_TOKENS table
token_format: "JWT"
token_expiry: "28800" # 8 hours in seconds
refresh_threshold: "1800" # 30 minutes in seconds
max_concurrent_sessions: 3
token_algorithm: "RS256"
issuer: "his-admin-system"
3. Field-Specific Validation Rules
3.1 USERS Table Constraints
ALTER TABLE USERS ADD CONSTRAINT chk_email_format
CHECK (email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$');
ALTER TABLE USERS ADD CONSTRAINT chk_phone_format
CHECK (phone_number REGEXP '^[0-9+\-\s()]{8,20}$');
ALTER TABLE USERS ADD CONSTRAINT chk_employee_id_format
CHECK (employee_id REGEXP '^[A-Z0-9]{3,20}$');
ALTER TABLE USERS ADD CONSTRAINT chk_password_not_empty
CHECK (password_hash IS NOT NULL AND LENGTH(password_hash) >= 60);
3.2 GROUPS Table Constraints
ALTER TABLE GROUPS ADD CONSTRAINT chk_group_name_format
CHECK (group_name REGEXP '^[A-Za-z0-9_\-\.]{3,100}$');
ALTER TABLE GROUPS ADD CONSTRAINT chk_max_users_positive
CHECK (max_users IS NULL OR max_users > 0);
3.3 POLICIES Table Constraints
ALTER TABLE POLICIES ADD CONSTRAINT chk_policy_document_valid
CHECK (JSON_VALID(policy_document) = 1);
ALTER TABLE POLICIES ADD CONSTRAINT chk_version_format
CHECK (version REGEXP '^v[0-9]+\.[0-9]+$');
4. Business Logic Constraints
4.1 การควบคุมจำนวนผู้ใช้ในกลุ่ม
-- Trigger สำหรับตรวจสอบ max_users ของกลุ่ม
DELIMITER //
CREATE TRIGGER trg_check_group_max_users
BEFORE INSERT ON USER_GROUPS
FOR EACH ROW
BEGIN
DECLARE current_count INT;
DECLARE max_allowed INT;
SELECT COUNT(*), g.max_users
INTO current_count, max_allowed
FROM USER_GROUPS ug
JOIN GROUPS g ON g.group_id = ug.group_id
WHERE ug.group_id = NEW.group_id AND ug.is_active = TRUE
GROUP BY g.max_users;
IF max_allowed IS NOT NULL AND current_count >= max_allowed THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'กลุ่มนี้มีสมาชิกครบตามจำนวนที่กำหนดแล้ว';
END IF;
END//
DELIMITER ;
4.2 การควบคุม Session Duration
-- Trigger สำหรับตรวจสอบ max_session_duration
DELIMITER //
CREATE TRIGGER trg_check_session_duration
BEFORE INSERT ON USER_SESSIONS
FOR EACH ROW
BEGIN
DECLARE max_duration INT;
SELECT MIN(r.max_session_duration) INTO max_duration
FROM USER_ROLES ur
JOIN ROLES r ON r.role_id = ur.role_id
WHERE ur.user_id = NEW.user_id AND ur.is_active = TRUE;
IF max_duration IS NOT NULL THEN
SET NEW.expires_at = DATE_ADD(NEW.created_at, INTERVAL max_duration SECOND);
END IF;
END//
DELIMITER ;
5. Data Integrity Rules
5.1 Referential Integrity Constraints
-- ป้องกันการลบผู้ใช้ที่มี Active Sessions
ALTER TABLE USERS ADD CONSTRAINT chk_no_active_sessions_before_delete
CHECK (
NOT EXISTS (
SELECT 1 FROM USER_SESSIONS us
WHERE us.user_id = user_id
AND us.is_active = TRUE
) OR status != 'ACTIVE'
);
5.2 การตรวจสอบ JSON Schema
-- Validation function สำหรับ Policy Document
DELIMITER //
CREATE FUNCTION validate_policy_document(policy_doc JSON)
RETURNS BOOLEAN
READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE is_valid BOOLEAN DEFAULT FALSE;
-- ตรวจสอบ required fields
IF JSON_EXTRACT(policy_doc, '$.Version') IS NOT NULL
AND JSON_EXTRACT(policy_doc, '$.Statement') IS NOT NULL
AND JSON_TYPE(JSON_EXTRACT(policy_doc, '$.Statement')) = 'ARRAY'
THEN
SET is_valid = TRUE;
END IF;
RETURN is_valid;
END//
DELIMITER ;
ALTER TABLE POLICIES ADD CONSTRAINT chk_policy_schema
CHECK (validate_policy_document(policy_document) = TRUE);
6. Performance และ Monitoring Constraints
6.1 การจำกัดจำนวน Login Attempts
-- Auto-lock account after failed attempts
DELIMITER //
CREATE TRIGGER trg_check_failed_login_attempts
BEFORE UPDATE ON USERS
FOR EACH ROW
BEGIN
IF NEW.failed_login_attempts >= 5 THEN
SET NEW.status = 'LOCKED';
SET NEW.account_locked_until = DATE_ADD(NOW(), INTERVAL 30 MINUTE);
END IF;
END//
DELIMITER ;
6.2 การทำความสะอาดข้อมูลอัตโนมัติ
-- Event scheduler สำหรับลบ expired sessions
CREATE EVENT evt_cleanup_expired_sessions
ON SCHEDULE EVERY 1 HOUR
DO
DELETE FROM USER_SESSIONS
WHERE expires_at < NOW() OR is_active = FALSE;
-- Event scheduler สำหรับลบ audit logs เก่า
CREATE EVENT evt_cleanup_old_audit_logs
ON SCHEDULE EVERY 1 DAY
DO
DELETE FROM AUDIT_TRAIL
WHERE created_at < DATE_SUB(NOW(), INTERVAL 2 YEAR);