ข้ามไปที่เนื้อหา

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)
email 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)
email 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) หมายเลขโทรศัพท์
email 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 table
  • group_id สำหรับอ้างอิง GROUPS table
  • department_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 ทั้งหมดในโรงพยาบาลค่ายธนรัชน์ โดยครอบคลุม:

  1. Identity and Access Management - การจัดการผู้ใช้งาน กลุ่ม บทบาท และนโยบาย
  2. System Configuration - การตั้งค่าระบบและข้อมูลพื้นฐาน
  3. Communication & Monitoring - การสื่อสารและติดตามการใช้งาน
  4. Reporting & Analytics - การจัดการรายงานและการวิเคราะห์
  5. 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);