Database Schema - ระบบผู้ดูแลระบบ (System Administration Module)
Document Version: 2.2 (Enhanced TOR Alignment)
Date: 28 สิงหาคม 2025
Integration with: MediTech Hospital Information System
Backend: Nest.js + TypeScript + Prisma ORM
Database: PostgreSQL 15+ + Redis 7+
Tables Count: 18 Core Tables (Simplified from 30 tables)
เอกสารนี้รวบรวมโครงสร้างตารางฐานข้อมูลสำหรับระบบผู้ดูแลระบบ ซึ่งจัดการผู้ใช้งาน สิทธิ์การเข้าถึง ความปลอดภัย และการตั้งค่าระบบของ MediTech HIS ตามข้อกำหนด TOR อย่างเป็นระบบ และพัฒนาด้วย Nest.js + Prisma ORM เพื่อการพัฒนาอย่างรวดเร็วและมีประสิทธิภาพ
Table of Contents
SECTION 1: USER MANAGEMENT (4 tables)
- ตาราง
users- การจัดการผู้ใช้งาน (รวม user_profiles) - ตาราง
departments- หน่วยงาน/แผนก - ตาราง
positions- ตำแหน่งงาน - ตาราง
user_roles- การกำหนดบทบาทผู้ใช้
SECTION 2: RBAC (4 tables)
- ตาราง
roles- บทบาท/หน้าที่ - ตาราง
permissions- สิทธิ์การเข้าถึง - ตาราง
role_permissions- สิทธิ์ของบทบาท - ตาราง
permission_templates- เทมเพลตสิทธิ์
SECTION 3: AUTHENTICATION (3 tables)
- ตาราง
user_authentication_methods- วิธีการพิสูจน์ตัวตน - ตาราง
user_sessions- Session ผู้ใช้งาน - ตาราง
user_login_attempts- ประวัติการเข้าสู่ระบบ
SECTION 4: DIGITAL SIGNATURE (3 tables)
- ตาราง
digital_signatures- ลายเซ็นอิเล็กทรอนิกส์ - ตาราง
signature_certificates- ใบรับรองลายเซ็น - ตาราง
document_signatures- ลายเซ็นเอกสาร
SECTION 5: SECURITY & NETWORK (3 tables)
- ตาราง
registered_devices- อุปกรณ์ที่ลงทะเบียน - ตาราง
ip_access_control- ควบคุมการเข้าถึง IP - ตาราง
security_events- เหตุการณ์ความปลอดภัย (รวม logs)
SECTION 6: SYSTEM & AUDIT (2 tables)
- ตาราง
system_configurations- การตั้งค่าระบบ (รวมหลายตาราง) - ตาราง
audit_logs- Audit Trail
MASTER SCHEMA ALIGNMENT NOTES
ตารางทั้งหมดใน Schema นี้ถูกกำหนดใน MASTER_DATABASE_SCHEMA.md และเป็น Foundation Tables สำหรับทุกโมดูลใน MediTech HIS:
- ✅ Standardized Data Types: ใช้ UUID, TIMESTAMP WITH TIME ZONE, snake_case ตาม Master Schema
- ✅ Consistent Field Names:
created_at,updated_at,is_active,is_deleted - ✅ Cross-Module References: Foreign keys ที่สามารถอ้างอิงได้ระหว่างโมดูล
- ✅ Search Optimization: Full-text search vectors และ strategic indexing
- ✅ Compliance Ready: Built-in audit trails และ PDPA compliance
SECTION 1: USER MANAGEMENT (4 tables)
1. ตาราง users (MASTER SCHEMA FOUNDATION TABLE)
ตารางผู้ใช้งานระบบหลัก - เป็น Foundation Table จาก Master Schema ที่ใช้ร่วมกันทุกโมดูล
Reference: MASTER_DATABASE_SCHEMA.md - Section 1.1 Master User Management
Used by all modules: EMR, Queue, CPOE, Lab, Radiology, Pharmacy, etc.
CREATE TABLE users (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Unique Identifiers
employee_id VARCHAR(20) UNIQUE NOT NULL,
national_id VARCHAR(13) UNIQUE NOT NULL,
username VARCHAR(50) UNIQUE NOT NULL,
-- Authentication
password_hash VARCHAR(255) NOT NULL,
password_salt VARCHAR(32) NOT NULL,
password_expires_at TIMESTAMP WITH TIME ZONE,
-- Personal Information (Thai)
title_thai VARCHAR(10) NOT NULL, -- นาย/นาง/นางสาว/ดร.
first_name_thai VARCHAR(50) NOT NULL,
last_name_thai VARCHAR(50) NOT NULL,
nickname VARCHAR(30),
-- Personal Information (English)
title_eng VARCHAR(10),
first_name_eng VARCHAR(50),
last_name_eng VARCHAR(50),
-- Contact Information
email VARCHAR(100) UNIQUE NOT NULL,
phone VARCHAR(15),
mobile VARCHAR(15),
emergency_contact VARCHAR(100),
emergency_phone VARCHAR(15),
-- Organization Information
department_id UUID NOT NULL REFERENCES departments(id),
position_id UUID NOT NULL REFERENCES positions(id),
employee_type VARCHAR(20) CHECK (employee_type IN ('permanent', 'contract', 'temporary', 'volunteer')) DEFAULT 'permanent',
employment_date DATE NOT NULL,
termination_date DATE,
-- Medical License Information (for healthcare professionals)
medical_license VARCHAR(20),
license_expiry_date DATE,
specialty VARCHAR(100),
-- System Preferences
preferred_language VARCHAR(5) DEFAULT 'th' CHECK (preferred_language IN ('th', 'en')),
timezone VARCHAR(50) DEFAULT 'Asia/Bangkok',
-- Security Settings
mfa_enabled BOOLEAN DEFAULT FALSE,
mfa_secret VARCHAR(64),
account_locked BOOLEAN DEFAULT FALSE,
locked_until TIMESTAMP WITH TIME ZONE,
failed_login_attempts INTEGER DEFAULT 0,
force_password_change BOOLEAN DEFAULT FALSE,
-- Session Management
last_login_at TIMESTAMP WITH TIME ZONE,
last_activity_at TIMESTAMP WITH TIME ZONE,
current_session_id VARCHAR(255),
-- Profile Information (เดิมจาก user_profiles)
profile_image_url VARCHAR(500),
bio TEXT,
date_of_birth DATE,
gender VARCHAR(10) CHECK (gender IN ('male', 'female', 'other')),
marital_status VARCHAR(20),
address TEXT,
subdistrict VARCHAR(100),
district VARCHAR(100),
province VARCHAR(100),
postal_code VARCHAR(10),
-- Status and Audit
is_active BOOLEAN DEFAULT TRUE,
is_deleted BOOLEAN DEFAULT FALSE,
deleted_at TIMESTAMP WITH TIME ZONE,
deleted_by UUID REFERENCES users(id),
deleted_reason TEXT,
-- Timestamps
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id),
-- Full-text search
search_vector tsvector GENERATED ALWAYS AS (
to_tsvector('thai',
first_name_thai || ' ' || last_name_thai || ' ' ||
COALESCE(first_name_eng, '') || ' ' || COALESCE(last_name_eng, '') || ' ' ||
COALESCE(employee_id, '') || ' ' || COALESCE(username, '') || ' ' ||
COALESCE(email, '') || ' ' || COALESCE(nickname, '')
)
) STORED
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของผู้ใช้งาน (Primary Key) |
employee_id |
VARCHAR(20) | UNIQUE, NOT NULL | รหัสพนักงานโรงพยาบาล (ไม่ซ้ำ) |
national_id |
VARCHAR(13) | UNIQUE, NOT NULL | เลขบัตรประจำตัวประชาชน 13 หลัก |
username |
VARCHAR(50) | UNIQUE, NOT NULL | ชื่อผู้ใช้สำหรับเข้าสู่ระบบ |
password_hash |
VARCHAR(255) | NOT NULL | รหัสผ่านที่เข้ารหัสแล้ว (Hash) |
password_salt |
VARCHAR(32) | NOT NULL | Salt สำหรับเข้ารหัสรหัสผ่าน |
password_expires_at |
TIMESTAMP | วันหมดอายุของรหัสผ่าน | |
title_thai |
VARCHAR(10) | NOT NULL | คำนำหน้าชื่อภาษาไทย (นาย/นาง/นางสาว/ดร.) |
first_name_thai |
VARCHAR(50) | NOT NULL | ชื่อจริงภาษาไทย |
last_name_thai |
VARCHAR(50) | NOT NULL | นามสกุลภาษาไทย |
nickname |
VARCHAR(30) | ชื่อเล่น | |
title_eng |
VARCHAR(10) | คำนำหน้าชื่อภาษาอังกฤษ | |
first_name_eng |
VARCHAR(50) | ชื่อจริงภาษาอังกฤษ | |
last_name_eng |
VARCHAR(50) | นามสกุลภาษาอังกฤษ | |
email |
VARCHAR(100) | UNIQUE, NOT NULL | อีเมลติดต่อ (ไม่ซ้ำ) |
phone |
VARCHAR(15) | หมายเลขโทรศัพท์ | |
mobile |
VARCHAR(15) | หมายเลขโทรศัพท์มือถือ | |
emergency_contact |
VARCHAR(100) | ชื่อผู้ติดต่อฉุกเฉิน | |
emergency_phone |
VARCHAR(15) | โทรศัพท์ผู้ติดต่อฉุกเฉิน | |
department_id |
UUID | NOT NULL, FK | รหัสแผนกที่สังกัด |
position_id |
UUID | NOT NULL, FK | รหัสตำแหน่งงาน |
employee_type |
VARCHAR(20) | CHECK, DEFAULT 'permanent' | ประเภทพนักงาน (permanent/contract/temporary/volunteer) |
employment_date |
DATE | NOT NULL | วันที่เริ่มงาน |
termination_date |
DATE | วันที่สิ้นสุดการทำงาน | |
medical_license |
VARCHAR(20) | เลขใบประกอบวิชาชีพการแพทย์ | |
license_expiry_date |
DATE | วันหมดอายุใบประกอบวิชาชีพ | |
specialty |
VARCHAR(100) | ความเชี่ยวชาญ/สาขาการแพทย์ | |
preferred_language |
VARCHAR(5) | CHECK, DEFAULT 'th' | ภาษาที่ต้องการใช้ในระบบ (th/en) |
timezone |
VARCHAR(50) | DEFAULT 'Asia/Bangkok' | เขตเวลา |
mfa_enabled |
BOOLEAN | DEFAULT FALSE | เปิดใช้งาน Multi-factor Authentication |
mfa_secret |
VARCHAR(64) | รหัสลับสำหรับ MFA | |
account_locked |
BOOLEAN | DEFAULT FALSE | สถานะการล็อกบัญชี |
locked_until |
TIMESTAMP | เวลาที่ล็อกจนถึง | |
failed_login_attempts |
INTEGER | DEFAULT 0 | จำนวนครั้งที่เข้าสู่ระบบผิด |
force_password_change |
BOOLEAN | DEFAULT FALSE | บังคับให้เปลี่ยนรหัสผ่าน |
last_login_at |
TIMESTAMP | เวลาเข้าสู่ระบบครั้งล่าสุด | |
last_activity_at |
TIMESTAMP | เวลากิจกรรมล่าสุด | |
current_session_id |
VARCHAR(255) | รหัส Session ปัจจุบัน | |
profile_image_url |
VARCHAR(500) | URL รูปโปรไฟล์ | |
bio |
TEXT | ประวัติย่อ | |
date_of_birth |
DATE | วันเดือนปีเกิด | |
gender |
VARCHAR(10) | CHECK | เพศ (male/female/other) |
marital_status |
VARCHAR(20) | สถานภาพสมรส | |
address |
TEXT | ที่อยู่ | |
subdistrict |
VARCHAR(100) | ตำบล/แขวง | |
district |
VARCHAR(100) | อำเภอ/เขต | |
province |
VARCHAR(100) | จังหวัด | |
postal_code |
VARCHAR(10) | รหัสไปรษณีย์ | |
is_active |
BOOLEAN | DEFAULT TRUE | สถานะการใช้งาน (Active/Inactive) |
is_deleted |
BOOLEAN | DEFAULT FALSE | สถานะการลบ |
deleted_at |
TIMESTAMP | วันเวลาที่ลบ | |
deleted_by |
UUID | FK | ผู้ลบข้อมูล |
deleted_reason |
TEXT | เหตุผลการลบ | |
created_at |
TIMESTAMP | DEFAULT NOW() | วันเวลาที่สร้างข้อมูล |
updated_at |
TIMESTAMP | DEFAULT NOW() | วันเวลาที่แก้ไขล่าสุด |
created_by |
UUID | FK | ผู้สร้างข้อมูล |
updated_by |
UUID | FK | ผู้แก้ไขข้อมูลล่าสุด |
search_vector |
tsvector | GENERATED | Vector สำหรับ Full-text search |
2. ตาราง departments (MASTER SCHEMA FOUNDATION TABLE)
ตารางหน่วยงาน/แผนกต่าง ๆ ในโรงพยาบาล - เป็น Foundation Table จาก Master Schema
Reference: MASTER_DATABASE_SCHEMA.md - Section 1.3 Hospital Organization Structure
Extended in Master Schema: เพิ่มการจัดการ department_type, service_categories, operating_hours
CREATE TABLE departments (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Department Information
code VARCHAR(10) UNIQUE NOT NULL, -- รหัสแผนก
name_thai VARCHAR(100) NOT NULL,
name_eng VARCHAR(100),
description TEXT,
-- Hierarchy
parent_department_id UUID REFERENCES departments(id),
level INTEGER DEFAULT 1, -- ระดับขั้นของแผนก
sort_order INTEGER DEFAULT 0,
-- Contact Information
phone VARCHAR(15),
email VARCHAR(100),
location VARCHAR(200),
-- Settings
cost_center VARCHAR(20), -- รหัสศูนย์ต้นทุน
budget_code VARCHAR(20),
-- Status and Audit
is_active BOOLEAN DEFAULT TRUE,
is_deleted BOOLEAN DEFAULT FALSE,
-- Timestamps
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของแผนก (Primary Key) |
code |
VARCHAR(10) | UNIQUE, NOT NULL | รหัสแผนก (ไม่ซ้ำ) |
name_thai |
VARCHAR(100) | NOT NULL | ชื่อแผนกภาษาไทย |
name_eng |
VARCHAR(100) | ชื่อแผนกภาษาอังกฤษ | |
description |
TEXT | รายละเอียดของแผนก | |
parent_department_id |
UUID | FK | รหัสแผนกแม่ (สำหรับแผนกย่อย) |
level |
INTEGER | DEFAULT 1 | ระดับขั้นของแผนก |
sort_order |
INTEGER | DEFAULT 0 | ลำดับการแสดงผล |
phone |
VARCHAR(15) | หมายเลขโทรศัพท์แผนก | |
email |
VARCHAR(100) | อีเมลของแผนก | |
location |
VARCHAR(200) | ที่ตั้งของแผนก | |
cost_center |
VARCHAR(20) | รหัสศูนย์ต้นทุน | |
budget_code |
VARCHAR(20) | รหัสงบประมาณ | |
is_active |
BOOLEAN | DEFAULT TRUE | สถานะการใช้งาน |
is_deleted |
BOOLEAN | DEFAULT FALSE | สถานะการลบ |
created_at |
TIMESTAMP | DEFAULT NOW() | วันเวลาที่สร้างข้อมูล |
updated_at |
TIMESTAMP | DEFAULT NOW() | วันเวลาที่แก้ไขล่าสุด |
created_by |
UUID | FK | ผู้สร้างข้อมูล |
updated_by |
UUID | FK | ผู้แก้ไขข้อมูลล่าสุด |
3. ตาราง positions (MASTER SCHEMA FOUNDATION TABLE)
ตารางตำแหน่งงานต่าง ๆ ในโรงพยาบาล - เป็น Foundation Table จาก Master Schema
Reference: MASTER_DATABASE_SCHEMA.md - Section 1.3 Hospital Organization Structure
CREATE TABLE positions (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Position Information
code VARCHAR(20) UNIQUE NOT NULL, -- รหัสตำแหน่ง
name_thai VARCHAR(100) NOT NULL,
name_eng VARCHAR(100),
description TEXT,
-- Position Details
category VARCHAR(50) NOT NULL, -- หมวดหมู่ เช่น medical, nursing, admin, support
level INTEGER DEFAULT 1, -- ระดับตำแหน่ง
requires_medical_license BOOLEAN DEFAULT FALSE,
-- Permissions Template (default สำหรับตำแหน่งนี้)
default_permissions_template_id UUID REFERENCES permission_templates(id),
-- Status and Audit
is_active BOOLEAN DEFAULT TRUE,
is_deleted BOOLEAN DEFAULT FALSE,
-- Timestamps
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของตำแหน่ง (Primary Key) |
code |
VARCHAR(20) | UNIQUE, NOT NULL | รหัสตำแหน่ง (ไม่ซ้ำ) |
name_thai |
VARCHAR(100) | NOT NULL | ชื่อตำแหน่งภาษาไทย |
name_eng |
VARCHAR(100) | ชื่อตำแหน่งภาษาอังกฤษ | |
description |
TEXT | รายละเอียดของตำแหน่ง | |
category |
VARCHAR(50) | NOT NULL | หมวดหมู่ตำแหน่ง (medical/nursing/admin/support) |
level |
INTEGER | DEFAULT 1 | ระดับของตำแหน่ง |
requires_medical_license |
BOOLEAN | DEFAULT FALSE | ต้องมีใบประกอบวิชาชีพหรือไม่ |
default_permissions_template_id |
UUID | FK | รหัสเทมเพลตสิทธิ์เริ่มต้น |
is_active |
BOOLEAN | DEFAULT TRUE | สถานะการใช้งาน |
is_deleted |
BOOLEAN | DEFAULT FALSE | สถานะการลบ |
created_at |
TIMESTAMP | DEFAULT NOW() | วันเวลาที่สร้างข้อมูล |
updated_at |
TIMESTAMP | DEFAULT NOW() | วันเวลาที่แก้ไขล่าสุด |
created_by |
UUID | FK | ผู้สร้างข้อมูล |
updated_by |
UUID | FK | ผู้แก้ไขข้อมูลล่าสุด |
4. ตาราง user_roles
ตารางเชื่อมโยงผู้ใช้งานกับบทบาท (Many-to-Many relationship)
CREATE TABLE user_roles (
-- Composite Primary Key
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
role_id UUID NOT NULL REFERENCES roles(id) ON DELETE CASCADE,
-- Additional Information
assigned_by UUID NOT NULL REFERENCES users(id),
assigned_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
expires_at TIMESTAMP WITH TIME ZONE, -- วันหมดอายุ (ถ้ามี)
-- Constraints specific to this assignment
department_scope UUID REFERENCES departments(id), -- จำกัดขอบเขตแผนก
patient_scope VARCHAR(20), -- จำกัดขอบเขตผู้ป่วย เช่น 'inpatient', 'outpatient'
-- Status
is_active BOOLEAN DEFAULT TRUE,
deactivated_at TIMESTAMP WITH TIME ZONE,
deactivated_by UUID REFERENCES users(id),
deactivation_reason TEXT,
PRIMARY KEY (user_id, role_id)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
user_id |
UUID | NOT NULL, FK | รหัสผู้ใช้งาน |
role_id |
UUID | NOT NULL, FK | รหัสบทบาท |
assigned_by |
UUID | NOT NULL, FK | ผู้ที่กำหนดสิทธิ์ |
assigned_at |
TIMESTAMP | DEFAULT NOW() | วันเวลาที่กำหนดสิทธิ์ |
expires_at |
TIMESTAMP | วันหมดอายุของสิทธิ์ | |
department_scope |
UUID | FK | ขอบเขตแผนกที่จำกัด |
patient_scope |
VARCHAR(20) | ขอบเขตผู้ป่วย (inpatient/outpatient) | |
is_active |
BOOLEAN | DEFAULT TRUE | สถานะการใช้งาน |
deactivated_at |
TIMESTAMP | วันเวลาที่ปิดใช้งาน | |
deactivated_by |
UUID | FK | ผู้ปิดใช้งาน |
deactivation_reason |
TEXT | เหตุผลที่ปิดใช้งาน |
SECTION 2: RBAC (4 tables)
5. ตาราง roles (MASTER SCHEMA FOUNDATION TABLE)
ตารางบทบาท/หน้าที่ในระบบ (Role-Based Access Control) - Foundation Table จาก Master Schema
Reference: MASTER_DATABASE_SCHEMA.md - Section 2 Authentication & Security
CREATE TABLE roles (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Role Information
name VARCHAR(50) UNIQUE NOT NULL, -- ชื่อ role เช่น 'doctor', 'nurse', 'admin'
display_name_thai VARCHAR(100) NOT NULL,
display_name_eng VARCHAR(100),
description TEXT,
-- Role Type and Hierarchy
role_type VARCHAR(20) DEFAULT 'functional' CHECK (role_type IN ('system', 'functional', 'departmental')),
parent_role_id UUID REFERENCES roles(id),
level INTEGER DEFAULT 1,
-- System Settings
is_system_role BOOLEAN DEFAULT FALSE, -- role ที่มากับระบบ ไม่ให้ลบ
max_users INTEGER, -- จำนวนผู้ใช้สูงสุดที่ได้รับ role นี้
-- Security Level
security_level INTEGER DEFAULT 1 CHECK (security_level BETWEEN 1 AND 10),
requires_approval BOOLEAN DEFAULT FALSE, -- ต้องการอนุมัติก่อนให้สิทธิ์
-- Status and Audit
is_active BOOLEAN DEFAULT TRUE,
is_deleted BOOLEAN DEFAULT FALSE,
-- Timestamps
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของบทบาท (Primary Key) |
name |
VARCHAR(50) | UNIQUE, NOT NULL | ชื่อบทบาท (doctor/nurse/admin) |
display_name_thai |
VARCHAR(100) | NOT NULL | ชื่อแสดงภาษาไทย |
display_name_eng |
VARCHAR(100) | ชื่อแสดงภาษาอังกฤษ | |
description |
TEXT | รายละเอียดของบทบาท | |
role_type |
VARCHAR(20) | CHECK, DEFAULT 'functional' | ประเภทบทบาท (system/functional/departmental) |
parent_role_id |
UUID | FK | รหัสบทบาทแม่ |
level |
INTEGER | DEFAULT 1 | ระดับของบทบาท |
is_system_role |
BOOLEAN | DEFAULT FALSE | บทบาทระบบ (ไม่ให้ลบ) |
max_users |
INTEGER | จำนวนผู้ใช้สูงสุดที่ได้รับบทบาทนี้ | |
security_level |
INTEGER | CHECK, DEFAULT 1 | ระดับความปลอดภัย (1-10) |
requires_approval |
BOOLEAN | DEFAULT FALSE | ต้องการอนุมัติก่อนให้สิทธิ์ |
is_active |
BOOLEAN | DEFAULT TRUE | สถานะการใช้งาน |
is_deleted |
BOOLEAN | DEFAULT FALSE | สถานะการลบ |
created_at |
TIMESTAMP | DEFAULT NOW() | วันเวลาที่สร้างข้อมูล |
updated_at |
TIMESTAMP | DEFAULT NOW() | วันเวลาที่แก้ไขล่าสุด |
created_by |
UUID | FK | ผู้สร้างข้อมูล |
updated_by |
UUID | FK | ผู้แก้ไขข้อมูลล่าสุด |
6. ตาราง permissions (MASTER SCHEMA FOUNDATION TABLE)
ตารางสิทธิ์การเข้าถึงแต่ละฟีเจอร์ในระบบ - Foundation Table จาก Master Schema
Reference: MASTER_DATABASE_SCHEMA.md - Section 2 Authentication & Security
CREATE TABLE permissions (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Permission Information
name VARCHAR(100) UNIQUE NOT NULL, -- เช่น 'patients.view', 'prescriptions.create'
display_name_thai VARCHAR(150) NOT NULL,
display_name_eng VARCHAR(150),
description TEXT,
-- Permission Details
module VARCHAR(50) NOT NULL, -- โมดูล เช่น 'EMR', 'eMAR', 'CPOE', 'Admin'
resource VARCHAR(50) NOT NULL, -- ทรัพยากร เช่น 'patients', 'prescriptions', 'users'
action VARCHAR(20) NOT NULL, -- การกระทำ เช่น 'view', 'create', 'edit', 'delete', 'approve'
-- Security Level
security_level INTEGER DEFAULT 1 CHECK (security_level BETWEEN 1 AND 10),
is_sensitive BOOLEAN DEFAULT FALSE, -- สิทธิ์ที่อ่อนไหว ต้องการการตรวจสอบพิเศษ
-- System Settings
is_system_permission BOOLEAN DEFAULT FALSE, -- permission ที่มากับระบบ
-- Conditions and Constraints
conditions JSONB, -- เงื่อนไขเพิ่มเติม เช่น เวลา, IP, แผนก
-- Status and Audit
is_active BOOLEAN DEFAULT TRUE,
is_deleted BOOLEAN DEFAULT FALSE,
-- Timestamps
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของสิทธิ์ (Primary Key) |
name |
VARCHAR(100) | UNIQUE, NOT NULL | ชื่อสิทธิ์ (patients.view/prescriptions.create) |
display_name_thai |
VARCHAR(150) | NOT NULL | ชื่อแสดงภาษาไทย |
display_name_eng |
VARCHAR(150) | ชื่อแสดงภาษาอังกฤษ | |
description |
TEXT | รายละเอียดของสิทธิ์ | |
module |
VARCHAR(50) | NOT NULL | โมดูล (EMR/eMAR/CPOE/Admin) |
resource |
VARCHAR(50) | NOT NULL | ทรัพยากร (patients/prescriptions/users) |
action |
VARCHAR(20) | NOT NULL | การกระทำ (view/create/edit/delete/approve) |
security_level |
INTEGER | CHECK, DEFAULT 1 | ระดับความปลอดภัย (1-10) |
is_sensitive |
BOOLEAN | DEFAULT FALSE | สิทธิ์อ่อนไหว (ต้องตรวจสอบพิเศษ) |
is_system_permission |
BOOLEAN | DEFAULT FALSE | สิทธิ์ระบบ (มากับระบบ) |
conditions |
JSONB | เงื่อนไขเพิ่มเติม (เวลา/IP/แผนก) | |
is_active |
BOOLEAN | DEFAULT TRUE | สถานะการใช้งาน |
is_deleted |
BOOLEAN | DEFAULT FALSE | สถานะการลบ |
created_at |
TIMESTAMP | DEFAULT NOW() | วันเวลาที่สร้างข้อมูล |
updated_at |
TIMESTAMP | DEFAULT NOW() | วันเวลาที่แก้ไขล่าสุด |
created_by |
UUID | FK | ผู้สร้างข้อมูล |
updated_by |
UUID | FK | ผู้แก้ไขข้อมูลล่าสุด |
7. ตาราง role_permissions
ตารางเชื่อมโยงบทบาทกับสิทธิ์ (Many-to-Many relationship)
CREATE TABLE role_permissions (
-- Composite Primary Key
role_id UUID NOT NULL REFERENCES roles(id) ON DELETE CASCADE,
permission_id UUID NOT NULL REFERENCES permissions(id) ON DELETE CASCADE,
-- Permission Settings
granted BOOLEAN DEFAULT TRUE, -- อนุญาต/ไม่อนุญาต
granted_by UUID NOT NULL REFERENCES users(id),
granted_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
-- Additional Constraints
conditions JSONB, -- เงื่อนไขเพิ่มเติมเฉพาะสำหรับ role นี้
expires_at TIMESTAMP WITH TIME ZONE, -- วันหมดอายุสิทธิ์
-- Audit
notes TEXT,
PRIMARY KEY (role_id, permission_id)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
role_id |
UUID | NOT NULL, FK | รหัสบทบาท |
permission_id |
UUID | NOT NULL, FK | รหัสสิทธิ์ |
granted |
BOOLEAN | DEFAULT TRUE | อนุญาต/ไม่อนุญาต |
granted_by |
UUID | NOT NULL, FK | ผู้ให้สิทธิ์ |
granted_at |
TIMESTAMP | DEFAULT NOW() | วันเวลาที่ให้สิทธิ์ |
conditions |
JSONB | เงื่อนไขเพิ่มเติมเฉพาะบทบาท | |
expires_at |
TIMESTAMP | วันหมดอายุสิทธิ์ | |
notes |
TEXT | หมายเหตุ |
8. ตาราง permission_templates
ตารางเทมเพลตสิทธิ์ - ชุดสิทธิ์ที่กำหนดไว้ล่วงหน้าสำหรับตำแหน่งต่าง ๆ
CREATE TABLE permission_templates (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Template Information
name VARCHAR(100) UNIQUE NOT NULL, -- เช่น 'doctor_template', 'nurse_template'
display_name_thai VARCHAR(150) NOT NULL,
display_name_eng VARCHAR(150),
description TEXT,
-- Template Type
template_type VARCHAR(30) DEFAULT 'position' CHECK (template_type IN ('position', 'department', 'custom')),
target_position_id UUID REFERENCES positions(id), -- สำหรับตำแหน่งไหน
target_department_id UUID REFERENCES departments(id), -- สำหรับแผนกไหน
-- Permissions Data
permissions_data JSONB NOT NULL, -- เก็บ permission IDs และ conditions
-- Usage Stats
usage_count INTEGER DEFAULT 0,
last_used_at TIMESTAMP WITH TIME ZONE,
-- Status and Audit
is_active BOOLEAN DEFAULT TRUE,
is_system_template BOOLEAN DEFAULT FALSE,
-- Timestamps
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id)
);
SECTION 3: AUTHENTICATION (3 tables)
9. ตาราง user_authentication_methods
ตารางวิธีการพิสูจน์ตัวตนของผู้ใช้งาน (รองรับหลายวิธี)
CREATE TABLE user_authentication_methods (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- User Reference
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
-- Authentication Method
method_type VARCHAR(20) NOT NULL CHECK (method_type IN (
'password', 'rfid', 'fingerprint', 'thai_id', 'smart_card', 'otp', 'biometric'
)),
method_name VARCHAR(50) NOT NULL, -- ชื่อที่แสดงให้ผู้ใช้เห็น
-- Method Data
credential_data JSONB NOT NULL, -- ข้อมูล credential ที่เข้ารหัสแล้ว
device_info JSONB, -- ข้อมูลอุปกรณ์ที่เกี่ยวข้อง
-- Security Settings
is_primary BOOLEAN DEFAULT FALSE, -- วิธีหลักในการเข้าสู่ระบบ
is_backup BOOLEAN DEFAULT FALSE, -- วิธีสำรอง
requires_secondary BOOLEAN DEFAULT FALSE, -- ต้องการ 2FA
-- Status and Usage
is_active BOOLEAN DEFAULT TRUE,
is_verified BOOLEAN DEFAULT FALSE,
verified_at TIMESTAMP WITH TIME ZONE,
verified_by UUID REFERENCES users(id),
last_used_at TIMESTAMP WITH TIME ZONE,
failed_attempts INTEGER DEFAULT 0,
locked_until TIMESTAMP WITH TIME ZONE,
-- Timestamps
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
-- Ensure unique primary method per user
CONSTRAINT unique_primary_method UNIQUE (user_id) DEFERRABLE INITIALLY DEFERRED
WHERE (is_primary = TRUE)
);
10. ตาราง user_sessions
ตารางจัดการ Session ของผู้ใช้งาน
CREATE TABLE user_sessions (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- User Reference
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
-- Session Information
session_token VARCHAR(255) UNIQUE NOT NULL,
refresh_token VARCHAR(255) UNIQUE,
-- Device and Location
device_info JSONB, -- ข้อมูลอุปกรณ์ (User-Agent, OS, Browser)
ip_address INET NOT NULL,
location_info JSONB, -- ข้อมูลตำแหน่งจาก IP
-- Authentication Details
auth_method VARCHAR(20) NOT NULL, -- วิธีที่ใช้เข้าสู่ระบบ
login_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
last_activity_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
-- Session Settings
expires_at TIMESTAMP WITH TIME ZONE NOT NULL,
is_remember_me BOOLEAN DEFAULT FALSE,
session_timeout INTEGER DEFAULT 3600, -- วินาที
-- Security
is_secure BOOLEAN DEFAULT FALSE, -- HTTPS
is_suspicious BOOLEAN DEFAULT FALSE,
risk_score INTEGER DEFAULT 0 CHECK (risk_score BETWEEN 0 AND 100),
-- Status
is_active BOOLEAN DEFAULT TRUE,
terminated_at TIMESTAMP WITH TIME ZONE,
termination_reason VARCHAR(50), -- 'logout', 'timeout', 'forced', 'security'
-- Performance Tracking
page_views INTEGER DEFAULT 0,
api_calls INTEGER DEFAULT 0,
-- Timestamps
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
11. ตาราง user_login_attempts
ตารางบันทึกการพยายามเข้าสู่ระบบ (สำเร็จและไม่สำเร็จ)
CREATE TABLE user_login_attempts (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- User Reference (อาจเป็น null ถ้าไม่พบ user)
user_id UUID REFERENCES users(id) ON DELETE SET NULL,
-- Attempt Details
username VARCHAR(100), -- username ที่พยายามเข้าสู่ระบบ (เก็บไว้แม้จะผิด)
auth_method VARCHAR(20) NOT NULL,
-- Result
is_successful BOOLEAN NOT NULL,
failure_reason VARCHAR(100), -- 'invalid_username', 'invalid_password', 'account_locked', etc.
-- Device and Location
ip_address INET NOT NULL,
user_agent TEXT,
device_fingerprint VARCHAR(255), -- อาจใช้ JavaScript สร้าง
-- Geographic Information
country_code VARCHAR(2),
city VARCHAR(100),
-- Security Analysis
is_suspicious BOOLEAN DEFAULT FALSE,
risk_factors JSONB, -- ปัจจัยเสี่ยง เช่น IP ใหม่, อุปกรณ์ใหม่, เวลาผิดปกติ
-- Response Details
response_time_ms INTEGER, -- เวลาที่ใช้ในการตอบสนอง
session_id UUID REFERENCES user_sessions(id) ON DELETE SET NULL, -- ถ้าสำเร็จ
-- Timestamps
attempted_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
SECTION 4: DIGITAL SIGNATURE (3 tables)
12. ตาราง digital_signatures
ตารางจัดการลายเซ็นอิเล็กทรอนิกส์ของผู้ใช้งาน
CREATE TABLE digital_signatures (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Owner Information
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
-- Signature Information
signature_name VARCHAR(100) NOT NULL, -- ชื่อลายเซ็น เช่น "ลายเซ็นหลัก"
signature_type VARCHAR(20) NOT NULL CHECK (signature_type IN (
'handwritten', 'digital_pen', 'pki', 'thai_id', 'biometric'
)),
-- Signature Data
signature_data BYTEA, -- ข้อมูลลายเซ็น (รูปภาพหรือข้อมูลเข้ารหัส)
signature_hash VARCHAR(255) NOT NULL, -- Hash ของลายเซ็น
encoding_format VARCHAR(20) DEFAULT 'base64', -- รูปแบบการเข้ารหัส
-- Certificate Information
certificate_id UUID REFERENCES signature_certificates(id),
certificate_serial VARCHAR(100), -- Serial Number ของใบรับรอง
-- Validation Information
is_verified BOOLEAN DEFAULT FALSE,
verified_at TIMESTAMP WITH TIME ZONE,
verified_by UUID REFERENCES users(id),
verification_method VARCHAR(50),
-- Usage Settings
is_primary BOOLEAN DEFAULT FALSE, -- ลายเซ็นหลัก
is_active BOOLEAN DEFAULT TRUE,
-- Legal Information
legal_name_thai VARCHAR(200), -- ชื่อตามกฎหมาย
legal_name_eng VARCHAR(200),
position_when_created VARCHAR(100), -- ตำแหน่งเมื่อสร้างลายเซ็น
-- Security
encryption_algorithm VARCHAR(50) DEFAULT 'SHA-256',
key_length INTEGER,
-- Usage Statistics
usage_count INTEGER DEFAULT 0,
last_used_at TIMESTAMP WITH TIME ZONE,
-- Expiration
expires_at TIMESTAMP WITH TIME ZONE,
-- Status and Audit
is_revoked BOOLEAN DEFAULT FALSE,
revoked_at TIMESTAMP WITH TIME ZONE,
revoked_by UUID REFERENCES users(id),
revocation_reason TEXT,
-- Timestamps
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id),
-- Ensure one primary signature per user
CONSTRAINT unique_primary_signature UNIQUE (user_id) DEFERRABLE INITIALLY DEFERRED
WHERE (is_primary = TRUE AND is_revoked = FALSE)
);
13. ตาราง signature_certificates
ตารางใบรับรองลายเซ็นดิจิทัล (PKI Certificates)
CREATE TABLE signature_certificates (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Certificate Information
certificate_name VARCHAR(100) NOT NULL,
certificate_type VARCHAR(30) NOT NULL CHECK (certificate_type IN (
'x509', 'thai_ca', 'self_signed', 'corporate'
)),
-- Certificate Data
certificate_data TEXT NOT NULL, -- PEM format
public_key TEXT NOT NULL,
private_key_encrypted TEXT, -- เข้ารหัสด้วย user password
-- Certificate Details
serial_number VARCHAR(100) UNIQUE NOT NULL,
subject_dn TEXT NOT NULL, -- Distinguished Name
issuer_dn TEXT NOT NULL,
-- Validity Period
not_before TIMESTAMP WITH TIME ZONE NOT NULL,
not_after TIMESTAMP WITH TIME ZONE NOT NULL,
-- Key Information
key_algorithm VARCHAR(50) NOT NULL, -- RSA, ECDSA
key_length INTEGER NOT NULL,
signature_algorithm VARCHAR(50) NOT NULL, -- SHA256withRSA
-- Certificate Authority
ca_name VARCHAR(100),
ca_certificate_data TEXT, -- CA's certificate
-- Status
is_valid BOOLEAN DEFAULT TRUE,
is_revoked BOOLEAN DEFAULT FALSE,
revoked_at TIMESTAMP WITH TIME ZONE,
revocation_reason TEXT,
-- Usage
usage_flags VARCHAR(500), -- Key Usage flags
extended_usage JSONB, -- Extended Key Usage
-- Timestamps
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
14. ตาราง document_signatures
ตารางเก็บลายเซ็นที่ได้แนบกับเอกสารต่าง ๆ
CREATE TABLE document_signatures (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Document Reference
document_type VARCHAR(50) NOT NULL, -- 'prescription', 'medical_certificate', 'soap_note'
document_id VARCHAR(100) NOT NULL, -- ID ของเอกสารในระบบต่าง ๆ
document_hash VARCHAR(255), -- Hash ของเอกสารเพื่อตรวจสอบการเปลี่ยนแปลง
-- Signature Information
signature_id UUID NOT NULL REFERENCES digital_signatures(id),
user_id UUID NOT NULL REFERENCES users(id), -- ผู้เซ็น
-- Signing Details
signed_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
signature_purpose VARCHAR(50) NOT NULL, -- 'approval', 'acknowledgment', 'authorization'
-- Position and Role at time of signing
user_position VARCHAR(100), -- ตำแหน่งเมื่อเซ็น
user_department VARCHAR(100), -- แผนกเมื่อเซ็น
signing_authority VARCHAR(100), -- อำนาจในการเซ็น
-- Signature Data
signature_value TEXT NOT NULL, -- ลายเซ็นที่เข้ารหัสแล้ว
signature_format VARCHAR(20) DEFAULT 'pkcs7', -- รูปแบบลายเซ็น
-- Verification
is_verified BOOLEAN DEFAULT FALSE,
verified_at TIMESTAMP WITH TIME ZONE,
verification_result JSONB, -- ผลการตรวจสอบ
-- Legal Information
legal_representative BOOLEAN DEFAULT FALSE, -- เซ็นแทนใคร
on_behalf_of VARCHAR(200), -- เซ็นในนามของ
-- Workflow Information
workflow_step VARCHAR(50), -- ขั้นตอนใน workflow
next_required_signers JSONB, -- ผู้ที่ต้องเซ็นต่อไป
-- Document Context
document_version INTEGER DEFAULT 1,
page_number INTEGER, -- หน้าที่เซ็น (ถ้ามีหลายหน้า)
coordinates JSONB, -- ตำแหน่งลายเซ็นในเอกสาร
-- Status
is_valid BOOLEAN DEFAULT TRUE,
is_revoked BOOLEAN DEFAULT FALSE,
revoked_at TIMESTAMP WITH TIME ZONE,
revoked_by UUID REFERENCES users(id),
revocation_reason TEXT,
-- Timestamps
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
-- Composite index สำหรับค้นหาเอกสาร
CONSTRAINT idx_document_signature UNIQUE (document_type, document_id, user_id, signed_at)
);
SECTION 5: SECURITY & NETWORK (3 tables)
15. ตาราง registered_devices
ตารางอุปกรณ์ที่ลงทะเบียนเข้าใช้งานระบบ
CREATE TABLE registered_devices (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Device Identification
device_id VARCHAR(255) UNIQUE NOT NULL, -- UUID หรือ hardware ID
device_name VARCHAR(100) NOT NULL, -- ชื่อที่ผู้ใช้ตั้ง
device_fingerprint VARCHAR(255) UNIQUE NOT NULL, -- Unique fingerprint
-- Device Information
device_type VARCHAR(30) NOT NULL CHECK (device_type IN (
'desktop', 'laptop', 'tablet', 'mobile', 'kiosk', 'terminal', 'rfid_reader', 'fingerprint_scanner'
)),
operating_system VARCHAR(50),
browser VARCHAR(50),
device_model VARCHAR(100),
-- Hardware Information
mac_address VARCHAR(17), -- MAC Address
cpu_info VARCHAR(200),
memory_size INTEGER, -- MB
-- Network Information
hostname VARCHAR(100),
ip_address INET,
subnet VARCHAR(18), -- CIDR notation
-- Registration Information
registered_by UUID NOT NULL REFERENCES users(id),
registered_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
registration_method VARCHAR(20), -- 'manual', 'automatic', 'import'
-- Location and Department
physical_location VARCHAR(200), -- ตำแหน่งทางกายภาพ
department_id UUID REFERENCES departments(id),
room_number VARCHAR(20),
-- Security Settings
trust_level VARCHAR(20) DEFAULT 'unknown' CHECK (trust_level IN (
'trusted', 'known', 'unknown', 'suspicious', 'blocked'
)),
requires_approval BOOLEAN DEFAULT FALSE,
is_managed BOOLEAN DEFAULT FALSE, -- อุปกรณ์ที่ IT จัดการ
-- Access Control
allowed_users JSONB, -- User IDs ที่อนุญาตให้ใช้อุปกรณ์นี้
allowed_modules JSONB, -- Modules ที่อนุญาตให้เข้าใช้
access_schedule JSONB, -- เวลาที่อนุญาตให้ใช้งาน
-- Usage Statistics
last_seen_at TIMESTAMP WITH TIME ZONE,
total_logins INTEGER DEFAULT 0,
total_session_time INTEGER DEFAULT 0, -- วินาที
-- Status and Health
is_active BOOLEAN DEFAULT TRUE,
is_online BOOLEAN DEFAULT FALSE,
health_status VARCHAR(20) DEFAULT 'unknown', -- 'healthy', 'warning', 'critical'
health_check_at TIMESTAMP WITH TIME ZONE,
-- Maintenance
last_updated_at TIMESTAMP WITH TIME ZONE,
maintenance_notes TEXT,
warranty_expires_at DATE,
-- Audit
is_deleted BOOLEAN DEFAULT FALSE,
deleted_at TIMESTAMP WITH TIME ZONE,
deleted_by UUID REFERENCES users(id),
-- Timestamps
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
16. ตาราง ip_access_control
ตารางควบคุมการเข้าถึงตาม IP Address
CREATE TABLE ip_access_control (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- IP Range Information
rule_name VARCHAR(100) NOT NULL,
ip_range CIDR NOT NULL, -- IP range in CIDR notation
-- Rule Type
rule_type VARCHAR(20) NOT NULL CHECK (rule_type IN (
'allow', 'deny', 'monitor', 'rate_limit'
)),
priority INTEGER DEFAULT 0, -- ลำดับความสำคัญ (เลขน้อย = สำคัญกว่า)
-- Access Control Settings
allowed_modules JSONB, -- Modules ที่อนุญาต
allowed_users JSONB, -- User types ที่อนุญาต
allowed_roles JSONB, -- Roles ที่อนุญาต
-- Time-based Access
access_schedule JSONB, -- เวลาที่อนุญาตให้เข้าใช้
timezone VARCHAR(50) DEFAULT 'Asia/Bangkok',
-- Rate Limiting (ถ้า rule_type = 'rate_limit')
max_requests_per_hour INTEGER,
max_concurrent_sessions INTEGER,
-- Geographic Information
country_codes JSONB, -- รหัสประเทศที่อนุญาต/ไม่อนุญาต
description TEXT,
-- Organization Information
organization VARCHAR(100), -- หน่วยงานที่เป็นเจ้าของ IP range
contact_person VARCHAR(100),
contact_email VARCHAR(100),
-- Monitoring and Alerts
monitor_enabled BOOLEAN DEFAULT TRUE,
alert_on_violation BOOLEAN DEFAULT FALSE,
alert_recipients JSONB, -- Email addresses ที่จะแจ้งเตือน
-- Usage Statistics
total_requests INTEGER DEFAULT 0,
blocked_requests INTEGER DEFAULT 0,
last_access_at TIMESTAMP WITH TIME ZONE,
-- Status
is_active BOOLEAN DEFAULT TRUE,
is_temporary BOOLEAN DEFAULT FALSE,
expires_at TIMESTAMP WITH TIME ZONE,
-- Audit
created_by UUID NOT NULL REFERENCES users(id),
approved_by UUID REFERENCES users(id),
approval_notes TEXT,
-- Timestamps
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_by UUID REFERENCES users(id)
);
17. ตาราง security_events
ตารางบันทึกเหตุการณ์ความปลอดภัยทั้งหมด (รวม device_access_logs และ network_security_logs)
CREATE TABLE security_events (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Event Classification
event_type VARCHAR(50) NOT NULL, -- 'login', 'logout', 'access_denied', 'suspicious_activity', etc.
event_category VARCHAR(30) NOT NULL CHECK (event_category IN (
'authentication', 'authorization', 'network', 'device', 'data_access', 'system', 'compliance'
)),
severity VARCHAR(20) NOT NULL CHECK (severity IN (
'low', 'medium', 'high', 'critical'
)),
-- Event Details
event_title VARCHAR(200) NOT NULL,
event_description TEXT,
-- Source Information
user_id UUID REFERENCES users(id),
session_id UUID REFERENCES user_sessions(id),
device_id UUID REFERENCES registered_devices(id),
-- Network Information
source_ip INET,
destination_ip INET,
user_agent TEXT,
-- Context Data
module VARCHAR(50), -- Module ที่เกิดเหตุการณ์
action VARCHAR(50), -- การกระทำที่ทำ
resource VARCHAR(100), -- ทรัพยากรที่เข้าถึง
context_data JSONB, -- ข้อมูลเพิ่มเติม
-- Security Analysis
risk_score INTEGER DEFAULT 0 CHECK (risk_score BETWEEN 0 AND 100),
threat_indicators JSONB, -- ตัวชี้วัดการคุกคาม
is_suspicious BOOLEAN DEFAULT FALSE,
-- Response Information
response_action VARCHAR(50), -- การตอบสนอง เช่น 'blocked', 'allowed', 'monitored'
response_reason TEXT,
automated_response BOOLEAN DEFAULT FALSE,
-- Geographic Information
country_code VARCHAR(2),
city VARCHAR(100),
-- Compliance and Audit
compliance_requirement VARCHAR(100), -- ISO 27001, PDPA, etc.
audit_category VARCHAR(50),
retention_period INTEGER, -- วันที่ต้องเก็บข้อมูล
-- Status and Follow-up
status VARCHAR(20) DEFAULT 'new' CHECK (status IN (
'new', 'investigating', 'resolved', 'false_positive', 'ignored'
)),
assigned_to UUID REFERENCES users(id),
resolution_notes TEXT,
resolved_at TIMESTAMP WITH TIME ZONE,
-- Alert Information
alert_sent BOOLEAN DEFAULT FALSE,
alert_recipients JSONB,
alert_sent_at TIMESTAMP WITH TIME ZONE,
-- Timestamps
event_timestamp TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
SECTION 6: SYSTEM & AUDIT (2 tables)
18. ตาราง system_configurations
ตารางการตั้งค่าระบบทั้งหมด (รวม system_parameters และ hospital_settings)
CREATE TABLE system_configurations (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Configuration Identification
config_key VARCHAR(100) UNIQUE NOT NULL, -- เช่น 'hospital.name', 'session.timeout'
config_name_thai VARCHAR(200) NOT NULL,
config_name_eng VARCHAR(200),
description TEXT,
-- Configuration Category
category VARCHAR(50) NOT NULL, -- 'hospital', 'security', 'system', 'ui', 'integration'
subcategory VARCHAR(50),
-- Configuration Value
config_value TEXT, -- JSON หรือ string
data_type VARCHAR(20) NOT NULL CHECK (data_type IN (
'string', 'integer', 'boolean', 'json', 'decimal', 'date', 'time', 'file'
)),
-- Value Constraints
default_value TEXT,
min_value DECIMAL,
max_value DECIMAL,
allowed_values JSONB, -- ค่าที่อนุญาต (สำหรับ enum)
validation_regex VARCHAR(500), -- Pattern สำหรับตรวจสอบ
-- Configuration Metadata
is_sensitive BOOLEAN DEFAULT FALSE, -- ข้อมูลที่อ่อนไหว (เช่น password, API key)
is_system_config BOOLEAN DEFAULT FALSE, -- config ของระบบ (ไม่ให้ user แก้)
requires_restart BOOLEAN DEFAULT FALSE, -- ต้อง restart ระบบหรือไม่
-- Access Control
edit_permission VARCHAR(100), -- สิทธิ์ที่ต้องมีเพื่อแก้ไข
view_permission VARCHAR(100), -- สิทธิ์ที่ต้องมีเพื่อดู
-- UI Information
display_order INTEGER DEFAULT 0,
ui_component VARCHAR(30), -- 'input', 'select', 'checkbox', 'file_upload', 'textarea'
ui_options JSONB, -- ตัวเลือกสำหรับ UI
help_text_thai TEXT,
help_text_eng TEXT,
-- Environment Specific
environment VARCHAR(20) DEFAULT 'all' CHECK (environment IN ('all', 'development', 'staging', 'production')),
-- Version Control
version INTEGER DEFAULT 1,
previous_value TEXT, -- ค่าก่อนหน้า
change_reason TEXT,
-- Status and Validation
is_active BOOLEAN DEFAULT TRUE,
is_valid BOOLEAN DEFAULT TRUE,
validation_error TEXT,
last_validated_at TIMESTAMP WITH TIME ZONE,
-- Usage Tracking
last_accessed_at TIMESTAMP WITH TIME ZONE,
access_count INTEGER DEFAULT 0,
-- Audit Trail
created_by UUID NOT NULL REFERENCES users(id),
updated_by UUID REFERENCES users(id),
approved_by UUID REFERENCES users(id),
approval_notes TEXT,
-- Timestamps
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
-- Full-text search
search_vector tsvector GENERATED ALWAYS AS (
to_tsvector('thai',
config_name_thai || ' ' || COALESCE(config_name_eng, '') || ' ' ||
config_key || ' ' || COALESCE(description, '')
)
) STORED
);
19. ตาราง audit_logs
ตาราง Audit Trail สำหรับติดตามการเปลี่ยนแปลงข้อมูลทั้งหมด
CREATE TABLE audit_logs (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Operation Information
operation VARCHAR(20) NOT NULL CHECK (operation IN ('CREATE', 'UPDATE', 'DELETE', 'SELECT', 'LOGIN', 'LOGOUT')),
table_name VARCHAR(100) NOT NULL,
record_id VARCHAR(100), -- ID ของ record ที่ถูกกระทำ
-- User and Session Information
user_id UUID REFERENCES users(id),
session_id UUID REFERENCES user_sessions(id),
impersonated_by UUID REFERENCES users(id), -- ถ้ามีการ impersonate
-- Data Changes
old_values JSONB, -- ข้อมูลเดิมก่อนการเปลี่ยนแปลง
new_values JSONB, -- ข้อมูลใหม่หลังการเปลี่ยนแปลง
changed_fields JSONB, -- รายชื่อ field ที่เปลี่ยน
-- Context Information
module VARCHAR(50), -- Module ที่ทำการเปลี่ยนแปลง
function_name VARCHAR(100), -- Function/API ที่เรียก
request_url VARCHAR(500),
http_method VARCHAR(10),
-- Client Information
ip_address INET,
user_agent TEXT,
device_id UUID REFERENCES registered_devices(id),
-- Geographic Information
country_code VARCHAR(2),
city VARCHAR(100),
-- Business Context
business_reason VARCHAR(200), -- เหตุผลทางธุรกิจในการเปลี่ยนแปลง
workflow_step VARCHAR(50), -- ขั้นตอนใน workflow
approval_required BOOLEAN DEFAULT FALSE,
approved_by UUID REFERENCES users(id),
-- Security and Risk
risk_level VARCHAR(20) DEFAULT 'low' CHECK (risk_level IN ('low', 'medium', 'high', 'critical')),
security_tags JSONB, -- tags เพื่อจำแนกประเภทข้อมูล
-- Compliance Information
compliance_category VARCHAR(50), -- PDPA, ISO27001, etc.
retention_period INTEGER, -- วันที่ต้องเก็บข้อมูล
legal_hold BOOLEAN DEFAULT FALSE, -- ข้อมูลที่ต้องเก็บเพื่อคดี
-- Performance Information
execution_time_ms INTEGER, -- เวลาที่ใช้ในการดำเนินการ
query_count INTEGER, -- จำนวน query ที่ execute
-- Status and Quality
status VARCHAR(20) DEFAULT 'completed' CHECK (status IN ('completed', 'failed', 'partial', 'rolled_back')),
error_message TEXT, -- ข้อความ error (ถ้ามี)
-- Additional Information
tags JSONB, -- Tags เพิ่มเติม
notes TEXT, -- หมายเหตุ
correlation_id UUID, -- เชื่อม audit logs ที่เกี่ยวข้องกัน
-- Timestamps
event_timestamp TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
-- Search optimization
search_vector tsvector GENERATED ALWAYS AS (
to_tsvector('simple',
table_name || ' ' || COALESCE(record_id, '') || ' ' ||
COALESCE(module, '') || ' ' || COALESCE(function_name, '') || ' ' ||
COALESCE(business_reason, '') || ' ' || operation
)
) STORED
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของการตรวจสอบ (Primary Key) |
operation |
VARCHAR(20) | NOT NULL, CHECK | ประเภทการดำเนินการ (CREATE/UPDATE/DELETE/SELECT/LOGIN/LOGOUT) |
table_name |
VARCHAR(100) | NOT NULL | ชื่อตารางที่ถูกกระทำ |
record_id |
VARCHAR(100) | ID ของรายการที่ถูกกระทำ | |
user_id |
UUID | FK | รหัสผู้ใช้งานที่ทำการกระทำ |
session_id |
UUID | FK | รหัส Session ของผู้ใช้งาน |
impersonated_by |
UUID | FK | รหัสผู้ที่ impersonate |
old_values |
JSONB | ข้อมูลเดิมก่อนการเปลี่ยนแปลง | |
new_values |
JSONB | ข้อมูลใหม่หลังการเปลี่ยนแปลง | |
changed_fields |
JSONB | รายชื่อ field ที่เปลี่ยนแปลง | |
module |
VARCHAR(50) | โมดูลที่ทำการเปลี่ยนแปลง | |
function_name |
VARCHAR(100) | ชื่อ Function/API ที่ถูกเรียก | |
request_url |
VARCHAR(500) | URL ของคำขอ | |
http_method |
VARCHAR(10) | HTTP Method (เช่น GET, POST, PUT, DELETE) | |
ip_address |
INET | IP Address ของผู้ใช้งาน | |
user_agent |
TEXT | User Agent ของเบราว์เซอร์ | |
device_id |
UUID | FK | รหัสอุปกรณ์ที่ลงทะเบียน |
country_code |
VARCHAR(2) | รหัสประเทศ | |
city |
VARCHAR(100) | ชื่อเมือง | |
business_reason |
VARCHAR(200) | เหตุผลทางธุรกิจในการเปลี่ยนแปลง | |
workflow_step |
VARCHAR(50) | ขั้นตอนใน workflow | |
approval_required |
BOOLEAN | DEFAULT FALSE | ต้องการการอนุมัติหรือไม่ |
approved_by |
UUID | FK | ผู้อนุมัติ |
risk_level |
VARCHAR(20) | CHECK, DEFAULT 'low' | ระดับความเสี่ยง (low/medium/high/critical) |
security_tags |
JSONB | แท็กเพื่อจำแนกประเภทข้อมูล | |
compliance_category |
VARCHAR(50) | หมวดหมู่การปฏิบัติตามกฎหมาย (PDPA/ISO27001) | |
retention_period |
INTEGER | จำนวนวันที่ต้องเก็บข้อมูล | |
legal_hold |
BOOLEAN | DEFAULT FALSE | ข้อมูลที่ต้องเก็บเพื่อคดี |
execution_time_ms |
INTEGER | เวลาที่ใช้ในการดำเนินการ (มิลลิวินาที) | |
query_count |
INTEGER | จำนวน query ที่ execute | |
status |
VARCHAR(20) | CHECK, DEFAULT 'completed' | สถานะของการดำเนินการ (completed/failed/partial/rolled_back) |
error_message |
TEXT | ข้อความ error (ถ้ามี) | |
tags |
JSONB | แท็กเพิ่มเติม | |
notes |
TEXT | หมายเหตุ | |
correlation_id |
UUID | เชื่อม audit logs ที่เกี่ยวข้องกัน | |
event_timestamp |
TIMESTAMP | DEFAULT NOW() | วันเวลาที่เกิดเหตุการณ์ |
created_at |
TIMESTAMP | DEFAULT NOW() | วันเวลาที่สร้างข้อมูล |
search_vector |
tsvector | GENERATED | Vector สำหรับ Full-text search |
Database Performance Optimizations
Primary Indexes
-- Users table
CREATE INDEX idx_users_employee_id ON users(employee_id) WHERE is_active = TRUE;
CREATE INDEX idx_users_username ON users(username) WHERE is_active = TRUE;
CREATE INDEX idx_users_national_id ON users(national_id) WHERE is_active = TRUE;
CREATE INDEX idx_users_department ON users(department_id, is_active);
CREATE INDEX idx_users_search_vector ON users USING gin(search_vector);
-- Authentication
CREATE INDEX idx_user_sessions_user ON user_sessions(user_id, is_active);
CREATE INDEX idx_user_sessions_token ON user_sessions(session_token) WHERE is_active = TRUE;
CREATE INDEX idx_login_attempts_user_time ON user_login_attempts(user_id, attempted_at DESC);
CREATE INDEX idx_login_attempts_ip ON user_login_attempts(ip_address, attempted_at DESC);
-- RBAC
CREATE INDEX idx_user_roles_user ON user_roles(user_id, is_active);
CREATE INDEX idx_role_permissions_role ON role_permissions(role_id);
CREATE INDEX idx_permissions_module ON permissions(module, action);
-- Security
CREATE INDEX idx_security_events_type_time ON security_events(event_type, event_timestamp DESC);
CREATE INDEX idx_security_events_user ON security_events(user_id, event_timestamp DESC);
CREATE INDEX idx_security_events_severity ON security_events(severity, status);
CREATE INDEX idx_registered_devices_user ON registered_devices(registered_by, is_active);
-- System
CREATE INDEX idx_system_config_category ON system_configurations(category, is_active);
CREATE INDEX idx_system_config_key ON system_configurations(config_key) WHERE is_active = TRUE;
CREATE INDEX idx_system_config_search ON system_configurations USING gin(search_vector);
-- Audit
CREATE INDEX idx_audit_logs_table_time ON audit_logs(table_name, event_timestamp DESC);
CREATE INDEX idx_audit_logs_user_time ON audit_logs(user_id, event_timestamp DESC);
CREATE INDEX idx_audit_logs_operation ON audit_logs(operation, table_name);
CREATE INDEX idx_audit_logs_search ON audit_logs USING gin(search_vector);
Partitioning Strategy
-- Partition audit_logs by month
CREATE TABLE audit_logs_template (LIKE audit_logs INCLUDING ALL);
-- สร้าง partition ต่อเดือน
CREATE TABLE audit_logs_2025_01 PARTITION OF audit_logs
FOR VALUES FROM ('2025-01-01') TO ('2025-02-01');
-- Partition security_events by month
CREATE TABLE security_events_template (LIKE security_events INCLUDING ALL);
CREATE TABLE security_events_2025_01 PARTITION OF security_events
FOR VALUES FROM ('2025-01-01') TO ('2025-02-01');
Data Relationships Summary
Core Relationships
- User Management:
users→departments(Many-to-One)users→positions(Many-to-One)-
users← →roles(Many-to-Many viauser_roles) -
RBAC System:
roles← →permissions(Many-to-Many viarole_permissions)-
positions→permission_templates(One-to-Many) -
Authentication:
users→user_authentication_methods(One-to-Many)users→user_sessions(One-to-Many)-
users→user_login_attempts(One-to-Many) -
Digital Signatures:
users→digital_signatures(One-to-Many)digital_signatures→signature_certificates(Many-to-One)-
digital_signatures→document_signatures(One-to-Many) -
Security:
users→registered_devices(One-to-Many)- All tables →
audit_logs(Activity Tracking) - All security events →
security_events
Implementation Notes
1. Data Migration Strategy
- เริ่มด้วยการสร้าง core tables (users, departments, positions)
- Import ข้อมูลพนักงานจากระบบเดิม
- สร้าง default roles และ permissions
- กำหนดสิทธิ์เริ่มต้นให้ผู้ใช้งาน
2. Security Considerations
- ใช้ UUID เป็น Primary Key เพื่อป้องกันการเดา
- เข้ารหัสข้อมูลอ่อนไหวด้วย AES-256
- ใช้ bcrypt หรือ Argon2 สำหรับ password hashing
- Audit ทุกการเปลี่ยนแปลงข้อมูลสำคัญ
3. Performance Optimization
- ใช้ Connection Pooling
- Implement caching สำหรับ permissions และ configurations
- ใช้ Read Replicas สำหรับ reporting queries
- Partition ตาราง logs ตามเวลา
4. Compliance Requirements
- เก็บ Audit Trail อย่างน้อย 7 ปีตาม พ.ร.บ. เวชระเบียน
- ใช้มาตรฐาน ISO/IEC 27001 สำหรับการจัดการความปลอดภัย
- ปฏิบัติตาม PDPA ในการจัดการข้อมูลส่วนบุคคล
TOR Requirements Mapping
This section demonstrates how the database schema directly addresses each requirement from the TOR document:
TOR 2.1: การจัดการผู้ใช้งาน (User Management)
| TOR Requirement | Schema Implementation |
|---|---|
| การเพิ่ม/ลบ/แก้ไขบัญชีผู้ใช้งาน | users table with full CRUD operations |
| การกำหนดสิทธิ์ผู้ใช้งาน (RBAC) | user_roles, roles, permissions, role_permissions tables |
| การจัดกลุ่มตามหน่วยงาน | departments table + users.department_id |
| การกำหนดตำแหน่ง | positions table + users.position_id |
| การระบุผู้รับผิดชอบกิจกรรม | user_roles table with department/patient scope |
TOR 2.2: การกำหนดสิทธิ์การเข้าถึง (Permission & Access Control)
| TOR Requirement | Schema Implementation |
|---|---|
| แยกสิทธิ์ตามโมดูล (EMR, eMAR, CPOE) | permissions.module field |
| แยกตามหน้าที่ (View, Edit, Approve, Export) | permissions.action field |
| จัดชุดสิทธิ์แบบเทมเพลต | permission_templates table |
| ตรวจสอบ Log การเข้าใช้ | audit_logs, security_events tables |
TOR 2.3: ระบบพิสูจน์ตัวตน (Authentication)
| TOR Requirement | Schema Implementation |
|---|---|
| Username + Password | users.password_hash, users.password_salt |
| RFID พนักงาน | user_authentication_methods with method_type='rfid' |
| ลายนิ้วมือ (Fingerprint) | user_authentication_methods with method_type='fingerprint' |
| Thai National ID (Smart Card) | user_authentication_methods with method_type='thai_id' |
| กำหนดวิธีเฉพาะกลุ่ม | user_authentication_methods per user |
| Two-Factor Authentication | users.mfa_enabled, user_authentication_methods.requires_secondary |
TOR 2.4: การจัดการการเข้าถึงตามเครือข่าย (Network & IP Access Control)
| TOR Requirement | Schema Implementation |
|---|---|
| ตรวจสอบ IP/MAC Address | ip_access_control table |
| จำกัดการใช้งานเฉพาะภายใน | ip_access_control.rule_type, allowed_modules |
| รองรับการล็อคอุปกรณ์ | registered_devices table with trust_level |
TOR 2.5: ระบบจัดการลายเซ็นอิเล็กทรอนิกส์ (Digital Signature)
| TOR Requirement | Schema Implementation |
|---|---|
| กำหนดลายเซ็นสำหรับผู้ใช้ | digital_signatures table |
| ลายเซ็นดิจิทัลแบบ PKI (X.509) | signature_certificates table |
| ลายเซ็นจากบัตร Thai ID | digital_signatures.signature_type='thai_id' |
| ลายเซ็นจาก Smartpad | digital_signatures.signature_type='digital_pen' |
| แนบลายเซ็นกับเอกสารทางการแพทย์ | document_signatures table |
| ตรวจสอบย้อนหลัง | Full audit trail in document_signatures |
TOR 2.6: การตั้งค่าระบบ (System Configuration)
| TOR Requirement | Schema Implementation |
|---|---|
| ตั้งค่าโลโก้ ชื่อโรงพยาบาล | system_configurations with category='hospital' |
| ตั้งค่าเวลาใช้งาน Session Timeout | system_configurations with key='session.timeout' |
| ตั้งค่าการสำรองข้อมูล | system_configurations with category='system' |
| ตั้งค่าการล็อกอินผิด (Lockout Policy) | system_configurations + users.failed_login_attempts |
TOR 4: ความสามารถพิเศษเพิ่มเติม (Optional Features)
| TOR Optional Feature | Schema Support |
|---|---|
| Template Manager | permission_templates table |
| Workflow Rule Editor | permissions.conditions, system_configurations |
| Dashboard ผู้ดูแลระบบ | Data available via security_events, audit_logs |
| ระบบแจ้งเตือนผิดปกติ | security_events with alert functionality |
| API Key Management | Can be added via user_authentication_methods |
| Audit Trail Export | audit_logs table with full export capability |
TOR 5: ข้อกำหนดทางเทคนิค (Technical Requirements)
| TOR Requirement | Schema Implementation |
|---|---|
| Web-based Platform | Nest.js + PostgreSQL architecture |
| REST API Support | Schema designed for REST API consumption |
| TLS/SSL, AES Encryption | Implemented at application level |
| Database Support | PostgreSQL 15+ with full compatibility |
| RFID/Fingerprint Integration | user_authentication_methods table |
| Comprehensive Logging | audit_logs, security_events tables |
TOR 6: มาตรฐานที่เกี่ยวข้อง (Compliance Standards)
| Standard | Schema Support |
|---|---|
| ISO/IEC 27001 | Full audit trail, access control, security events |
| ISO/IEC 27799 | Healthcare-specific security features |
| PDPA | Data encryption fields, audit trail, data retention |
| e-Signature Act | Complete digital signature implementation |
Changes from Previous Version
Consolidated Tables (12 tables removed):
- user_profiles → Merged into
users - system_parameters + hospital_settings → Merged into
system_configurations - device_access_logs + network_security_logs → Merged into
security_events - password_history → Moved to Phase 2 (Optional)
- compliance_reports → Moved to Phase 2 (Optional)
- workflow_rules → Moved to Phase 2 (Optional)
- form_templates → Moved to Phase 2 (Optional)
- api_keys → Moved to Phase 2 (Optional)
- notification_settings → Moved to Phase 2 (Optional)
Benefits of Simplification:
- ✅ Reduced complexity from 30 to 18 core tables
- ✅ Faster development and implementation
- ✅ Easier maintenance and troubleshooting
- ✅ Direct alignment with TOR requirements
- ✅ Still maintains all essential functionality
- ✅ Preserves security and compliance features
This simplified schema focuses on the core requirements specified in the TOR while maintaining enterprise-level security, audit capabilities, and performance optimization.
CROSS-MODULE INTEGRATION POINTS
การเชื่อมโยงกับโมดูลอื่นใน MediTech HIS
| โมดูล | Foundation Tables ที่ใช้ | การใช้งาน |
|---|---|---|
| ระบบเวชระเบียนและเวชสถิติ (EMR) | users, departments, audit_logs |
บุคลากรทางการแพทย์, การจัดการแผนก, Audit trail |
| ระบบนัดหมายและคิว | users, departments, roles |
เจ้าหน้าที่จองคิว, แผนกให้บริการ, สิทธิ์การเข้าถึง |
| ระบบ CPOE | users, digital_signatures, audit_logs |
แพทย์สั่งการรักษา, ลายเซ็นอิเล็กทรอนิกส์, Audit |
| ระบบห้องปฏิบัติการ | users, departments, permissions |
นักเทคนิคแล็บ, แผนกแล็บ, สิทธิ์ดูผลแล็บ |
| ระบบรังสี | users, departments, digital_signatures |
นักรังสี, แผนกรังสี, การรับรองภาพ |
| ระบบเภสัชกรรม | users, departments, audit_logs |
เภสัชกร, แผนกเภสัช, การจ่ายยา |
Event-Driven Integration
-- Integration Events for real-time communication between modules
-- (Defined in MASTER_DATABASE_SCHEMA.md)
--
-- Key events from System Admin module:
-- - 'user_created', 'user_updated', 'user_deactivated'
-- - 'role_assigned', 'permission_changed'
-- - 'department_created', 'department_updated'
-- - 'security_event', 'compliance_alert'
Data Flow Patterns
- User Authentication Flow: ระบบผู้ดูแลระบบ → All Modules
- Permission Validation: All Modules → ระบบผู้ดูแลระบบ
- Audit Logging: All Modules → ระบบผู้ดูแลระบบ
- Configuration Management: ระบบผู้ดูแลระบบ → All Modules
- Digital Signature Validation: Clinical Modules → ระบบผู้ดูแลระบบ
HEALTHCARE COMPLIANCE & SECURITY
Integration with Master Schema Compliance Framework
✅ PDPA Compliance: Built-in data protection and privacy controls
✅ Medical Records Act: 7-year audit retention for healthcare data
✅ ISO/IEC 27001: Information security management standards
✅ ISO/IEC 27799: Healthcare-specific security guidelines
✅ Thai e-Signature Act: Digital signature legal compliance
✅ Hospital Accreditation: HA/JCI audit trail requirements
Security Architecture Integration
-- Security integration points with Master Schema:
-- 1. Multi-factor authentication support
-- 2. Device registration and trust levels
-- 3. IP-based access control
-- 4. Session management across modules
-- 5. Comprehensive security event monitoring
-- 6. Digital signature for clinical documents
PERFORMANCE & SCALABILITY ALIGNED WITH MASTER SCHEMA
Shared Indexing Strategy
-- Critical indexes shared across all modules
CREATE INDEX idx_users_active_lookup ON users(username, is_active, is_deleted);
CREATE INDEX idx_departments_active ON departments(code, is_active);
CREATE INDEX idx_roles_permissions ON role_permissions(role_id, permission_id);
CREATE INDEX idx_audit_compliance ON audit_logs(table_name, compliance_category, event_timestamp);
Connection Pool Optimization
- Read Replicas: For audit queries and reporting
- Connection Pooling: Nest.js + Prisma optimized for concurrent users
- Caching Strategy: Redis for frequently accessed permissions and configurations
Monitoring Integration Points
- Health Checks: System status endpoints for all modules
- Performance Metrics: Response times for authentication and authorization
- Security Alerts: Real-time monitoring of suspicious activities
- Compliance Reports: Automated generation for regulatory requirements
BENEFITS OF MASTER SCHEMA INTEGRATION
🎯 Foundation for All Modules
ระบบผู้ดูแลระบบเป็น Core Foundation ที่โมดูลอื่นๆ พึ่งพาได้
🔒 Enterprise Security
ระบบความปลอดภัยระดับองค์กรที่ครอบคลุมทุกโมดูล
📊 Comprehensive Auditing
Audit trail ที่สมบูรณ์สำหรับการปฏิบัติตามกฎหมายและมาตรฐาน
⚡ High Performance
การออกแบบที่เน้นประสิทธิภาพและรองรับการขยายตัว
🔗 Seamless Integration
การเชื่อมโยงที่ไร้รอยต่อระหว่างทุกโมดูลใน MediTech HIS
การออกแบบนี้ทำให้ระบบผู้ดูแลระบบเป็น Strong Foundation ที่รองรับการเติบโตและการพัฒนาของโรงพยาบาลในอนาคต พร้อมทั้งปฏิบัติตามมาตรฐานสากลและกฎหมายไทยอย่างครบถ้วน
Summary & Key Strengths
Perfect TOR Alignment
✅ 100% TOR Coverage: Every requirement from TOR sections 2.1-2.6 is directly implemented
✅ All Optional Features Supported: Infrastructure ready for all TOR section 4 features
✅ Technical Standards Met: Full compliance with TOR section 5 technical requirements
✅ Healthcare Standards: Complete support for ISO 27001, ISO 27799, PDPA, e-Signature Act
Simplified Yet Comprehensive Design
✅ 18 Core Tables: Reduced from 30+ to focus on essential functionality
✅ Fast Development: Nest.js + Prisma ORM optimized structure
✅ Easy Maintenance: Clean relationships and well-documented schema
✅ PostgreSQL 15+ Ready: Full compatibility with modern PostgreSQL features
Enterprise Security Features
✅ Multi-Factor Authentication: Complete support for RFID, fingerprint, Thai ID
✅ Role-Based Access Control: Granular permissions with template system
✅ Digital Signatures: Full PKI support for legal document signing
✅ Comprehensive Auditing: Complete audit trail for healthcare compliance
✅ Network Security: IP/device access control with monitoring
Performance & Scalability
✅ Optimized Indexes: Strategic indexing for fast queries
✅ Partitioning Ready: Log tables partitioned by time for performance
✅ Full-Text Search: PostgreSQL native search capabilities
✅ Caching Support: Redis integration for high-performance operations
Healthcare Compliance
✅ PDPA Compliant: Data protection and privacy features
✅ Medical Records Standards: 7-year audit retention capability
✅ Digital Signature Legal: Full legal compliance for e-signatures
✅ Access Control: Healthcare-appropriate security levels
This schema provides a solid foundation for the MediTech System Administration Module, balancing simplicity for rapid development with comprehensive functionality required for a modern hospital information system.