Database Schema Design
ระบบเวชระเบียน (Core Medical Record System)
โรงพยาบาลค่ายธนรัชน์
เอกสารเลขที่: SRS-1.2.1-SCHEMA
เวอร์ชัน: 2.0
วันที่: 4 ตุลาคม 2568
ผู้จัดทำ: ทีมพัฒนาระบบ
ผู้อนุมัติ: ผู้อำนวยการโรงพยาบาลค่ายธนรัชน์
การปรับปรุง: แยกฟีเจอร์ที่ซ้ำซ้อนและเพิ่ม Integration API
Database Schema Design
ระบบเวชระเบียนเป็นระบบหลักที่ทำหน้าที่จัดการข้อมูลผู้ป่วยหลัก การลงทะเบียน การส่งตรวจ และการจัดการแฟ้มเวชระเบียน โดยเชื่อมโยงกับระบบอื่นผ่าน API Integration:
- ระบบซักประวัติ (1.2.2): การจัดการประวัติการรักษารายละเอียด
- ระบบตรวจสอบสิทธิ (1.2.15): การตรวจสอบและยืนยันสิทธิการรักษา
- ระบบการเงิน (1.2.14): การคำนวณและเรียกเก็บค่าบริการ
- ระบบเภสัชกรรม (1.2.13): การสั่งจ่ายยาและเวชภัณฑ์
- ระบบห้องตรวจ (1.2.3): การจัดการคิวและตรวจรักษา
8.2.1 ตารางหลัก (Core Tables)
8.2.1.1 ข้อมูลผู้ป่วยหลัก
Table: PATIENT (ข้อมูลผู้ป่วย)
วัตถุประสงค์: เก็บข้อมูลประวัติผู้ป่วยหลักทั้งหมด รวมถึงข้อมูลส่วนตัว เอกสารประจำตัว ที่อยู่ และข้อมูลทางการแพทย์พื้นฐาน ซึ่งจะเป็นข้อมูลอ้างอิงสำหรับระบบอื่นๆ ทั้งหมดใน HIS
| Field | Type | Key | Description |
|---|---|---|---|
| HN | VARCHAR(10) | PK | Hospital Number - หมายเลขประจำตัวผู้ป่วย |
| CitizenID | VARCHAR(13) | UK | เลขบัตรประจำตัวประชาชน |
| PassportNumber | VARCHAR(20) | เลขที่หนังสือเดินทาง | |
| AlienID | VARCHAR(20) | เลขที่บัตรแรงงานต่างด้าว | |
| OfficerID | VARCHAR(20) | เลขที่บัตรข้าราชการ | |
| TitleID | VARCHAR(10) | FK | รหัสคำนำหน้านาม (อ้างอิง TITLE_NAME) |
| FirstName | NVARCHAR(50) | ชื่อ | |
| LastName | NVARCHAR(50) | นามสกุล | |
| OldFirstName | NVARCHAR(50) | ชื่อเดิม (กรณีเปลี่ยนชื่อ) | |
| OldLastName | NVARCHAR(50) | นามสกุลเดิม (กรณีเปลี่ยนนามสกุล) | |
| GenderCode | CHAR(1) | FK | รหัสเพศ (อ้างอิง GENDER) |
| DateOfBirth | DATE | วันเดือนปีเกิด | |
| TimeOfBirth | TIME | เวลาเกิด | |
| Age | INT | อายุ (คำนวณจากวันเกิด) | |
| AgeInDays | INT | อายุเป็นวัน (สำหรับทารก < 1 เดือน) | |
| BloodGroupID | VARCHAR(5) | FK | รหัสหมู่เลือด (อ้างอิง BLOOD_GROUP) |
| MaritalStatusCode | VARCHAR(5) | FK | รหัสสถานภาพสมรส (อ้างอิง MARITAL_STATUS) |
| RaceCode | VARCHAR(5) | FK | รหัสเชื้อชาติ (อ้างอิง RACE) |
| NationalityCode | VARCHAR(5) | FK | รหัสสัญชาติ (อ้างอิง NATIONALITY) |
| OccupationGroupCode | VARCHAR(5) | FK | รหัสกลุ่มอาชีพ (อ้างอิง OCCUPATION_GROUP) |
| OccupationDetail | NVARCHAR(100) | รายละเอียดอาชีพเฉพาะ | |
| ReligionID | VARCHAR(5) | FK | รหัสศาสนา (อ้างอิง RELIGION) |
| FatherName | NVARCHAR(100) | ชื่อ-นามสกุลบิดา | |
| MotherName | NVARCHAR(100) | ชื่อ-นามสกุลมารดา | |
| SpouseName | NVARCHAR(100) | ชื่อ-นามสกุลคู่สมรส | |
| PhotoPath | VARCHAR(255) | path รูปถ่าย | |
| FingerprintData | VARBINARY(MAX) | ข้อมูลลายนิ้วมือ | |
| PhysicalDescription | NTEXT | รูปพรรณสัณฐาน | |
| IsDeceased | BIT | สถานะเสียชีวิต | |
| DeathDate | DATETIME | วันที่เสียชีวิต | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง | |
| LastModified | DATETIME | วันที่แก้ไขล่าสุด | |
| ModifiedBy | VARCHAR(50) | ผู้แก้ไขล่าสุด | |
| IsActive | BIT | ใช้งานได้ |
Table: PATIENT_ADDRESS (ที่อยู่ผู้ป่วย)
วัตถุประสงค์: เก็บข้อมูลที่อยู่ของผู้ป่วย รองรับได้หลายที่อยู่ โดยแยกที่อยู่ปัจจุบันและตามทะเบียนบ้าน
| Field | Type | Key | Description |
|---|---|---|---|
| AddressID | VARCHAR(20) | PK | รหัสที่อยู่ |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| AddressType | VARCHAR(20) | ประเภทที่อยู่ (CURRENT/REGISTERED) | |
| HouseNumber | NVARCHAR(20) | บ้านเลขที่ | |
| VillageNumber | NVARCHAR(10) | หมู่ | |
| Street | NVARCHAR(100) | ถนน | |
| SubdistrictCode | VARCHAR(10) | FK | รหัสตำบล (อ้างอิง SUBDISTRICT) |
| DistrictCode | VARCHAR(8) | FK | รหัสอำเภอ (อ้างอิง DISTRICT) |
| ProvinceCode | VARCHAR(5) | FK | รหัสจังหวัด (อ้างอิง PROVINCE) |
| PostalCode | VARCHAR(5) | รหัสไปรษณีย์ | |
| CountryCode | VARCHAR(3) | รหัสประเทศ (ISO3) | |
| PhoneNumber | VARCHAR(20) | หมายเลขโทรศัพท์ | |
| VARCHAR(100) | อีเมล | ||
| IsDefault | BIT | เป็นที่อยู่หลัก |
Table: PATIENT_CONTACT (ผู้ติดต่อผู้ป่วย)
วัตถุประสงค์: เก็บข้อมูลผู้ติดต่อฉุกเฉินและบุคคลที่เกี่ยวข้องกับผู้ป่วย
| Field | Type | Key | Description |
|---|---|---|---|
| ContactID | VARCHAR(20) | PK | รหัสผู้ติดต่อ |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| ContactName | NVARCHAR(100) | ชื่อผู้ติดต่อ | |
| RelationshipCode | VARCHAR(10) | FK | รหัสความสัมพันธ์ (อ้างอิง RELATIONSHIP) |
| PhoneNumber | VARCHAR(20) | หมายเลขโทรศัพท์ | |
| Address | NTEXT | ที่อยู่ | |
| IsEmergencyContact | BIT | เป็นผู้ติดต่อฉุกเฉิน |
Table: PATIENT_MEDICAL_HISTORY (ประวัติทางการแพทย์)
วัตถุประสงค์: เก็บข้อมูลโรคประจำตัว โรคเรื้อรัง และประวัติการเจ็บป่วยของผู้ป่วยและครอบครัว
| Field | Type | Key | Description |
|---|---|---|---|
| MedicalHistoryID | VARCHAR(20) | PK | รหัสประวัติทางการแพทย์ |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| DiseaseType | VARCHAR(20) | ประเภท (CHRONIC/CONGENITAL/FAMILY) | |
| DiseaseName | NVARCHAR(100) | ชื่อโรค | |
| OnsetYear | INT | ปีที่เริ่มเป็น | |
| FamilyMember | NVARCHAR(50) | สมาชิกครอบครัว (กรณีประวัติครอบครัว) | |
| MemberAge | INT | อายุสมาชิกครอบครัว | |
| IsDeceased | BIT | สถานะชีวิต (สำหรับประวัติครอบครัว) | |
| Notes | NTEXT | หมายเหตุ | |
| CreatedDate | DATETIME | วันที่บันทึก |
Table: PATIENT_FAMILY_INFO (ข้อมูลครอบครัว)
วัตถุประสงค์: เก็บข้อมูลด้านครอบครัวและสังคมของผู้ป่วย
| Field | Type | Key | Description |
|---|---|---|---|
| FamilyInfoID | VARCHAR(20) | PK | รหัสข้อมูลครอบครัว |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| FamilyStatus | NVARCHAR(50) | สถานะในครอบครัว | |
| PersonStatus | NVARCHAR(50) | สถานะบุคคล | |
| EducationLevelCode | VARCHAR(5) | FK | รหัสระดับการศึกษา (อ้างอิง EDUCATION_LEVEL) |
| PersonType | NVARCHAR(50) | ประเภทบุคคล | |
| CommunityPosition | NVARCHAR(100) | ตำแหน่งในชุมชน |
Table: PATIENT_OFFICER_INFO (ข้อมูลข้าราชการ)
วัตถุประสงค์: เก็บข้อมูลเฉพาะสำหรับผู้ป่วยที่เป็นข้าราชการ
| Field | Type | Key | Description |
|---|---|---|---|
| OfficerInfoID | VARCHAR(20) | PK | รหัสข้อมูลข้าราชการ |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| MainAgency | NVARCHAR(100) | สังกัดหลัก | |
| SubAgency | NVARCHAR(100) | สังกัดรอง | |
| Position | NVARCHAR(100) | ตำแหน่ง | |
| Level | VARCHAR(10) | ระดับ |
Table: PATIENT_ALIEN_INFO (ข้อมูลแรงงานต่างด้าว)
วัตถุประสงค์: เก็บข้อมูลเฉพาะสำหรับผู้ป่วยที่เป็นแรงงานต่างด้าว
| Field | Type | Key | Description |
|---|---|---|---|
| AlienInfoID | VARCHAR(20) | PK | รหัสข้อมูลแรงงานต่างด้าว |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| EmployerName | NVARCHAR(100) | ชื่อนายจ้าง | |
| EmployerType | NVARCHAR(50) | ประเภทนายจ้าง | |
| RegistrationUnit | NVARCHAR(100) | หน่วยขึ้นทะเบียน | |
| WorkPermitNumber | VARCHAR(20) | เลขที่ใบอนุญาตทำงาน |
8.2.1.2 ข้อมูลการเข้ารับบริการ
Table: VISIT (ข้อมูลการเข้ารับบริการ)
วัตถุประสงค์: เก็บข้อมูลการเข้ารับบริการของผู้ป่วยแต่ละครั้ง รวมถึงการส่งตรวจและข้อมูลที่เกี่ยวข้อง
| Field | Type | Key | Description |
|---|---|---|---|
| VisitID | VARCHAR(20) | PK | รหัส Visit |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| VisitDate | DATETIME | วันที่เข้ารับบริการ | |
| VisitTypeCode | VARCHAR(10) | FK | รหัสประเภทการมา (อ้างอิง VISIT_TYPE) |
| PatientTypeCode | VARCHAR(10) | FK | รหัสประเภทผู้ป่วย (อ้างอิง PATIENT_TYPE) |
| UrgencyCode | VARCHAR(10) | FK | รหัสความเร่งด่วน (อ้างอิง URGENCY_LEVEL) |
| ConditionCode | VARCHAR(10) | FK | รหัสสภาพผู้ป่วย (อ้างอิง PATIENT_CONDITION) |
| ChiefComplaint | NTEXT | อาการสำคัญ | |
| QueueNumber | VARCHAR(20) | หมายเลขคิว | |
| DepartmentCode | VARCHAR(10) | FK | รหัสแผนก (อ้างอิง DEPARTMENT) |
| RoomCode | VARCHAR(10) | FK | รหัสห้อง (อ้างอิง ROOM) |
| Doctor | NVARCHAR(100) | แพทย์ผู้รักษา | |
| Status | VARCHAR(20) | สถานะ (WAITING/EXAMINING/COMPLETED/CANCELLED) | |
| IsAdvanceBooking | BIT | การส่งตรวจล่วงหน้า | |
| PhotoPath | VARCHAR(255) | รูปถ่ายเมื่อมารับบริการ | |
| CreatedDate | DATETIME | วันที่บันทึก | |
| CreatedBy | VARCHAR(50) | ผู้บันทึก | |
| CompletedDate | DATETIME | วันที่เสร็จสิ้นการตรวจ |
Table: VISIT_RIGHTS (สิทธิการรักษาในแต่ละครั้ง)
วัตถุประสงค์: เก็บข้อมูลสิทธิการรักษาที่ใช้ในการเข้ารับบริการแต่ละครั้ง สามารถใช้ได้หลายสิทธิ
| Field | Type | Key | Description |
|---|---|---|---|
| VisitRightID | VARCHAR(20) | PK | รหัสสิทธิในการมา |
| VisitID | VARCHAR(20) | FK | รหัส Visit |
| RightTypeID | VARCHAR(10) | FK | รหัสประเภทสิทธิ (อ้างอิงจากระบบตรวจสอบสิทธิ) |
| RightNumber | VARCHAR(50) | เลขที่สิทธิ | |
| IsPrimary | BIT | เป็นสิทธิหลัก |
8.2.1.3 ข้อมูลประวัติและการจัดการ
Table: HN_HISTORY (ประวัติการเปลี่ยน HN)
วัตถุประสงค์: เก็บประวัติการเปลี่ยนแปลงหมายเลข HN ของผู้ป่วย เพื่อการติดตามและการรวม HN
| Field | Type | Key | Description |
|---|---|---|---|
| HNHistoryID | VARCHAR(20) | PK | รหัสประวัติ HN |
| CurrentHN | VARCHAR(10) | FK | HN ปัจจุบัน |
| OldHN | VARCHAR(10) | HN เดิม | |
| ChangeType | VARCHAR(20) | ประเภทการเปลี่ยน (MERGE/CHANGE) | |
| ChangeReason | NTEXT | เหตุผลการเปลี่ยน | |
| ChangeDate | DATETIME | วันที่เปลี่ยน | |
| ChangedBy | VARCHAR(50) | ผู้ทำการเปลี่ยน | |
| ApprovedBy | VARCHAR(50) | ผู้อนุมัติ |
Table: PATIENT_NOTES (หมายเหตุผู้ป่วย)
วัตถุประสงค์: เก็บหมายเหตุและข้อความเตือนเกี่ยวกับผู้ป่วย
| Field | Type | Key | Description |
|---|---|---|---|
| NoteID | VARCHAR(20) | PK | รหัสหมายเหตุ |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| NoteType | VARCHAR(20) | ประเภทหมายเหตุ (WARNING/INFO/DOCUMENT) | |
| NoteText | NTEXT | ข้อความหมายเหตุ | |
| DisplayFrom | DATETIME | วันที่เริ่มแสดง | |
| DisplayTo | DATETIME | วันที่หยุดแสดง | |
| IsPopup | BIT | แสดงเป็น Popup | |
| Priority | VARCHAR(10) | ระดับความสำคัญ (HIGH/MEDIUM/LOW) | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง | |
| IsActive | BIT | ใช้งานอยู่ |
8.2.2 ตารางรองรับการทำงาน (Support Tables)
8.2.2.1 การจัดการแฟ้มเวชระเบียน
Table: CHART_BORROWING (การยืม-คืนแฟ้มเวชระเบียน)
วัตถุประสงค์: บันทึกการยืมและคืนแฟ้มเวชระเบียนทั้งผู้ป่วยนอกและผู้ป่วยใน รองรับการติดตาม Real-time
| Field | Type | Key | Description |
|---|---|---|---|
| BorrowingID | VARCHAR(20) | PK | รหัสการยืม |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| AN | VARCHAR(15) | FK | รหัส Admission (สำหรับผู้ป่วยใน) |
| VisitID | VARCHAR(20) | FK | รหัส Visit (สำหรับผู้ป่วยนอก) |
| ChartType | VARCHAR(10) | ประเภทแฟ้ม (OPD/IPD) | |
| BorrowDate | DATETIME | วันที่ยืม | |
| BorrowTime | TIME | เวลาที่ยืม | |
| BorrowerID | VARCHAR(50) | FK | รหัสผู้ยืม |
| BorrowDepartment | NVARCHAR(50) | แผนกที่ยืม | |
| BorrowReason | NVARCHAR(100) | สาเหตุการยืม | |
| BorrowerPhone | VARCHAR(20) | เบอร์โทรผู้ยืม | |
| ReturnDate | DATETIME | วันที่คืน | |
| ReturnTime | TIME | เวลาที่คืน | |
| ReturnedBy | VARCHAR(50) | FK | ผู้รับคืน |
| Status | VARCHAR(20) | สถานะ (BORROWED/RETURNED/OVERDUE/LOST) | |
| BarcodeID | VARCHAR(50) | รหัส Barcode | |
| IsAdvanceBorrow | BIT | ยืมล่วงหน้า (สำหรับนัดหมาย) | |
| Location | NVARCHAR(100) | ตำแหน่งปัจจุบันของแฟ้ม |
Table: CHART_LOCATION (ตำแหน่งแฟ้มเวชระเบียน)
วัตธุประสงค์: ติดตามตำแหน่งของแฟ้มเวชระเบียนแบบ Real-time
| Field | Type | Key | Description |
|---|---|---|---|
| LocationID | VARCHAR(20) | PK | รหัสตำแหน่ง |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| CurrentLocation | NVARCHAR(100) | ตำแหน่งปัจจุบัน | |
| LocationType | VARCHAR(20) | ประเภทตำแหน่ง (ROOM/DEPARTMENT/STORAGE) | |
| UpdateDate | DATETIME | วันที่อัพเดท | |
| UpdateBy | VARCHAR(50) | ผู้อัพเดท |
8.2.2.2 การนัดหมาย
Table: APPOINTMENT (การนัดหมาย)
วัตถุประสงค์: จัดการการนัดหมายผู้ป่วยและการส่งตรวจล่วงหน้า
| Field | Type | Key | Description |
|---|---|---|---|
| AppointmentID | VARCHAR(20) | PK | รหัสการนัดหมาย |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| AppointmentDate | DATE | วันที่นัด | |
| AppointmentTime | TIME | เวลาที่นัด | |
| DepartmentCode | VARCHAR(10) | FK | รหัสแผนก (อ้างอิง DEPARTMENT) |
| RoomCode | VARCHAR(10) | FK | รหัสห้อง (อ้างอิง ROOM) |
| DoctorID | VARCHAR(20) | FK | รหัสแพทย์ |
| AppointmentTypeCode | VARCHAR(10) | FK | รหัสประเภทการนัด (อ้างอิง APPOINTMENT_TYPE) |
| Notes | NTEXT | หมายเหตุ | |
| StatusCode | VARCHAR(10) | FK | รหัสสถานะ (อ้างอิง APPOINTMENT_STATUS) |
| IsChartPrepared | BIT | เตรียมแฟ้มแล้ว | |
| CreatedDate | DATETIME | วันที่สร้างนัด | |
| CreatedBy | VARCHAR(50) | ผู้สร้างนัด | |
| ConfirmedDate | DATETIME | วันที่ยืนยัน | |
| CompletedDate | DATETIME | วันที่เสร็จสิ้น |
8.2.3 ตารางจัดการระบบ (System Tables)
Table: AUDIT_LOG (บันทึกการแก้ไข)
วัตถุประสงค์: เก็บบันทึกการเปลี่ยนแปลงข้อมูลผู้ป่วยทั้งหมดเพื่อการตรวจสอบ
| Field | Type | Key | Description |
|---|---|---|---|
| LogID | VARCHAR(20) | PK | รหัส Log |
| TableName | VARCHAR(50) | ชื่อตาราง | |
| RecordID | VARCHAR(20) | รหัสระเบียน | |
| HN | VARCHAR(10) | รหัสผู้ป่วย (ถ้ามี) | |
| Action | VARCHAR(20) | การกระทำ (INSERT/UPDATE/DELETE) | |
| FieldName | VARCHAR(50) | ชื่อ Field ที่เปลี่ยน | |
| OldValue | NTEXT | ค่าเดิม | |
| NewValue | NTEXT | ค่าใหม่ | |
| ChangeDate | DATETIME | วันที่เปลี่ยน | |
| UserID | VARCHAR(50) | ผู้ทำการเปลี่ยน | |
| IPAddress | VARCHAR(50) | IP Address | |
| Reason | NTEXT | เหตุผล |
Table: SYSTEM_CONFIG (การตั้งค่าระบบ)
วัตถุประสงค์: เก็บการตั้งค่าต่างๆ ของระบบเวชระเบียน
| Field | Type | Key | Description |
|---|---|---|---|
| ConfigID | VARCHAR(20) | PK | รหัสการตั้งค่า |
| ConfigCategory | VARCHAR(50) | หมวดการตั้งค่า | |
| ConfigKey | VARCHAR(100) | คีย์การตั้งค่า | |
| ConfigValue | NTEXT | ค่าการตั้งค่า | |
| Description | NTEXT | คำอธิบาย | |
| IsActive | BIT | ใช้งานอยู่ | |
| LastModified | DATETIME | วันที่แก้ไขล่าสุด | |
| ModifiedBy | VARCHAR(50) | ผู้แก้ไข |
8.2.4 ตาราง Master Data (Master Data Tables)
8.2.4.1 ข้อมูลส่วนบุคคลและสังคม
Table: TITLE_NAME (คำนำหน้าชื่อ)
วัตถุประสงค์: เก็บข้อมูลคำนำหน้าชื่อทั้งภาษาไทยและอังกฤษ รองรับคำนำหน้าทางการแพทย์ ทหาร ตำรวจ และขุนนาง
| Field | Type | Key | Description |
|---|---|---|---|
| TitleID | VARCHAR(10) | PK | รหัสคำนำหน้า |
| TitleCode | VARCHAR(10) | UK | รหัสย่อ (MR, MRS, DR, etc.) |
| TitleNameTH | NVARCHAR(50) | ชื่อภาษาไทย | |
| TitleNameEN | VARCHAR(50) | ชื่อภาษาอังกฤษ | |
| Gender | CHAR(1) | เพศที่ใช้ได้ (M/F/U) | |
| Category | VARCHAR(20) | หมวดหมู่ (general/medical/army/police/royal/academic) | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
Table: GENDER (เพศ)
วัตถุประสงค์: เก็บข้อมูลเพศมาตรฐาน
| Field | Type | Key | Description |
|---|---|---|---|
| GenderCode | CHAR(1) | PK | รหัสเพศ (M/F/U/O) |
| GenderNameTH | NVARCHAR(20) | ชื่อภาษาไทย | |
| GenderNameEN | VARCHAR(20) | ชื่อภาษาอังกฤษ | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
Table: BLOOD_GROUP (หมู่เลือด)
วัตถุประสงค์: เก็บข้อมูลหมู่เลือดและ Rh Factor
| Field | Type | Key | Description |
|---|---|---|---|
| BloodGroupID | VARCHAR(5) | PK | รหัสหมู่เลือด |
| BloodGroup | VARCHAR(3) | หมู่เลือด (A, B, AB, O) | |
| RhFactor | VARCHAR(1) | Rh Factor (+, -, U) | |
| DisplayName | VARCHAR(10) | ชื่อแสดง (A+, B-, etc.) | |
| NameTH | NVARCHAR(20) | ชื่อภาษาไทย | |
| NameEN | VARCHAR(20) | ชื่อภาษาอังกฤษ | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
Table: MARITAL_STATUS (สถานภาพสมรส)
วัตถุประสงค์: เก็บข้อมูลสถานภาพสมรส
| Field | Type | Key | Description |
|---|---|---|---|
| MaritalStatusCode | VARCHAR(5) | PK | รหัสสถานภาพ |
| MaritalStatusNameTH | NVARCHAR(30) | ชื่อภาษาไทย | |
| MaritalStatusNameEN | VARCHAR(30) | ชื่อภาษาอังกฤษ | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
Table: RELIGION (ศาสนา)
วัตถุประสงค์: เก็บข้อมูลศาสนา
| Field | Type | Key | Description |
|---|---|---|---|
| ReligionID | VARCHAR(5) | PK | รหัสศาสนา |
| ReligionNameTH | NVARCHAR(50) | ชื่อภาษาไทย | |
| ReligionNameEN | VARCHAR(50) | ชื่อภาษาอังกฤษ | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
Table: NATIONALITY (สัญชาติ)
วัตถุประสงค์: เก็บข้อมูลสัญชาติตามมาตรฐาน ISO
| Field | Type | Key | Description |
|---|---|---|---|
| NationalityCode | VARCHAR(5) | PK | รหัสสัญชาติ |
| NationalityNameTH | NVARCHAR(50) | ชื่อภาษาไทย | |
| NationalityNameEN | VARCHAR(50) | ชื่อภาษาอังกฤษ | |
| ISO3Code | VARCHAR(3) | รหัส ISO 3166-1 alpha-3 | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
Table: RACE (เชื้อชาติ)
วัตถุประสงค์: เก็บข้อมูลเชื้อชาติ
| Field | Type | Key | Description |
|---|---|---|---|
| RaceCode | VARCHAR(5) | PK | รหัสเชื้อชาติ |
| RaceNameTH | NVARCHAR(50) | ชื่อภาษาไทย | |
| RaceNameEN | VARCHAR(50) | ชื่อภาษาอังกฤษ | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
8.2.4.2 ข้อมูลการศึกษาและอาชีพ
Table: EDUCATION_LEVEL (ระดับการศึกษา)
วัตถุประสงค์: เก็บข้อมูลระดับการศึกษา
| Field | Type | Key | Description |
|---|---|---|---|
| EducationLevelCode | VARCHAR(5) | PK | รหัสระดับการศึกษา |
| EducationLevelNameTH | NVARCHAR(100) | ชื่อภาษาไทย | |
| EducationLevelNameEN | VARCHAR(100) | ชื่อภาษาอังกฤษ | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
Table: OCCUPATION_GROUP (กลุ่มอาชีพ)
วัตถุประสงค์: เก็บข้อมูลกลุ่มอาชีพหลัก
| Field | Type | Key | Description |
|---|---|---|---|
| OccupationGroupCode | VARCHAR(5) | PK | รหัสกลุ่มอาชีพ |
| OccupationGroupNameTH | NVARCHAR(100) | ชื่อภาษาไทย | |
| OccupationGroupNameEN | VARCHAR(100) | ชื่อภาษาอังกฤษ | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
8.2.4.3 ข้อมูลภูมิศาสตร์
Table: REGION (ภูมิภาค)
วัตถุประสงค์: เก็บข้อมูลภูมิภาคของประเทศ
| Field | Type | Key | Description |
|---|---|---|---|
| RegionID | VARCHAR(2) | PK | รหัสภูมิภาค |
| RegionNameTH | NVARCHAR(50) | ชื่อภาษาไทย | |
| RegionNameEN | VARCHAR(50) | ชื่อภาษาอังกฤษ | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
Table: PROVINCE (จังหวัด)
วัตถุประสงค์: เก็บข้อมูลจังหวัดตามกรมการปกครอง
| Field | Type | Key | Description |
|---|---|---|---|
| ProvinceCode | VARCHAR(5) | PK | รหัสจังหวัด |
| ProvinceNameTH | NVARCHAR(100) | ชื่อภาษาไทย | |
| ProvinceNameEN | VARCHAR(100) | ชื่อภาษาอังกฤษ | |
| RegionID | VARCHAR(2) | FK | รหัสภูมิภาค |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
Table: DISTRICT (อำเภอ)
วัตถุประสงค์: เก็บข้อมูลอำเภอตามกรมการปกครอง
| Field | Type | Key | Description |
|---|---|---|---|
| DistrictCode | VARCHAR(8) | PK | รหัสอำเภอ |
| DistrictNameTH | NVARCHAR(100) | ชื่อภาษาไทย | |
| DistrictNameEN | VARCHAR(100) | ชื่อภาษาอังกฤษ | |
| ProvinceCode | VARCHAR(5) | FK | รหัสจังหวัด |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
Table: SUBDISTRICT (ตำบล)
วัตถุประสงค์: เก็บข้อมูลตำบลตามกรมการปกครอง
| Field | Type | Key | Description |
|---|---|---|---|
| SubdistrictCode | VARCHAR(10) | PK | รหัสตำบล |
| SubdistrictNameTH | NVARCHAR(100) | ชื่อภาษาไทย | |
| SubdistrictNameEN | VARCHAR(100) | ชื่อภาษาอังกฤษ | |
| DistrictCode | VARCHAR(8) | FK | รหัสอำเภอ |
| PostalCode | VARCHAR(5) | รหัสไปรษณีย์ | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
8.2.4.4 ข้อมูลระบบสุขภาพ
Table: PATIENT_TYPE (ประเภทผู้ป่วย)
วัตถุประสงค์: เก็บข้อมูลประเภทผู้ป่วยตาม TOR
| Field | Type | Key | Description |
|---|---|---|---|
| PatientTypeCode | VARCHAR(10) | PK | รหัสประเภทผู้ป่วย |
| PatientTypeNameTH | NVARCHAR(50) | ชื่อภาษาไทย | |
| PatientTypeNameEN | VARCHAR(50) | ชื่อภาษาอังกฤษ | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
Table: VISIT_TYPE (ประเภทการมา)
วัตถุประสงค์: เก็บข้อมูลประเภทการมารับการรักษา
| Field | Type | Key | Description |
|---|---|---|---|
| VisitTypeCode | VARCHAR(10) | PK | รหัสประเภทการมา |
| VisitTypeNameTH | NVARCHAR(50) | ชื่อภาษาไทย | |
| VisitTypeNameEN | VARCHAR(50) | ชื่อภาษาอังกฤษ | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
Table: URGENCY_LEVEL (ระดับความเร่งด่วน)
วัตถุประสงค์: เก็บข้อมูลระดับความเร่งด่วนของผู้ป่วย
| Field | Type | Key | Description |
|---|---|---|---|
| UrgencyCode | VARCHAR(10) | PK | รหัสความเร่งด่วน |
| UrgencyNameTH | NVARCHAR(50) | ชื่อภาษาไทย | |
| UrgencyNameEN | VARCHAR(50) | ชื่อภาษาอังกฤษ | |
| Priority | INT | ลำดับความสำคัญ (1=สูงสุด) | |
| ColorCode | VARCHAR(7) | รหัสสี (Hex) | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
Table: PATIENT_CONDITION (สภาพผู้ป่วย)
วัตถุประสงค์: เก็บข้อมูลสภาพการมาของผู้ป่วย
| Field | Type | Key | Description |
|---|---|---|---|
| ConditionCode | VARCHAR(10) | PK | รหัสสภาพผู้ป่วย |
| ConditionNameTH | NVARCHAR(50) | ชื่อภาษาไทย | |
| ConditionNameEN | VARCHAR(50) | ชื่อภาษาอังกฤษ | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
8.2.4.5 ข้อมูลความสัมพันธ์
Table: RELATIONSHIP (ความสัมพันธ์)
วัตถุประสงค์: เก็บข้อมูลความสัมพันธ์กับผู้ป่วย
| Field | Type | Key | Description |
|---|---|---|---|
| RelationshipCode | VARCHAR(10) | PK | รหัสความสัมพันธ์ |
| RelationshipNameTH | NVARCHAR(50) | ชื่อภาษาไทย | |
| RelationshipNameEN | VARCHAR(50) | ชื่อภาษาอังกฤษ | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
8.2.4.6 ข้อมูลหน่วยงาน
Table: DEPARTMENT (แผนก)
วัตถุประสงค์: เก็บข้อมูลแผนกต่างๆ ในโรงพยาบาล
| Field | Type | Key | Description |
|---|---|---|---|
| DepartmentCode | VARCHAR(10) | PK | รหัสแผนก |
| DepartmentNameTH | NVARCHAR(100) | ชื่อภาษาไทย | |
| DepartmentNameEN | VARCHAR(100) | ชื่อภาษาอังกฤษ | |
| DepartmentType | VARCHAR(10) | ประเภทแผนก (OPD/IPD/SUPPORT) | |
| ParentDepartmentCode | VARCHAR(10) | FK | แผนกแม่ |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
Table: ROOM (ห้อง)
วัตถุประสงค์: เก็บข้อมูลห้องต่างๆ ในแผนก
| Field | Type | Key | Description |
|---|---|---|---|
| RoomCode | VARCHAR(10) | PK | รหัสห้อง |
| RoomNameTH | NVARCHAR(100) | ชื่อภาษาไทย | |
| RoomNameEN | VARCHAR(100) | ชื่อภาษาอังกฤษ | |
| DepartmentCode | VARCHAR(10) | FK | รหัสแผนก |
| RoomType | VARCHAR(20) | ประเภทห้อง (EXAM/TREATMENT/WARD) | |
| Capacity | INT | ความจุผู้ป่วย | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
8.2.4.7 ข้อมูลการนัดหมาย
Table: APPOINTMENT_TYPE (ประเภทการนัด)
วัตถุประสงค์: เก็บข้อมูลประเภทการนัดหมาย
| Field | Type | Key | Description |
|---|---|---|---|
| AppointmentTypeCode | VARCHAR(10) | PK | รหัสประเภทการนัด |
| AppointmentTypeNameTH | NVARCHAR(50) | ชื่อภาษาไทย | |
| AppointmentTypeNameEN | VARCHAR(50) | ชื่อภาษาอังกฤษ | |
| ColorCode | VARCHAR(7) | รหัสสี (Hex) | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
Table: APPOINTMENT_STATUS (สถานะการนัด)
วัตถุประสงค์: เก็บข้อมูลสถานะการนัดหมาย
| Field | Type | Key | Description |
|---|---|---|---|
| StatusCode | VARCHAR(10) | PK | รหัสสถานะ |
| StatusNameTH | NVARCHAR(50) | ชื่อภาษาไทย | |
| StatusNameEN | VARCHAR(50) | ชื่อภาษาอังกฤษ | |
| ColorCode | VARCHAR(7) | รหัสสี (Hex) | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsActive | BIT | ใช้งานได้ |
8.2.5 Integration Schema (การเชื่อมโยงกับระบบอื่น)
หมายเหตุ: ส่วนนี้แสดง Schema สำหรับ API Integration กับระบบอื่นๆ เพื่อลดการซ้ำซ้อนและเพิ่มประสิทธิภาพ
Table: SYSTEM_INTEGRATION_LOG (บันทึกการเชื่อมต่อระบบ)
| Field | Type | Key | Description |
|---|---|---|---|
| LogID | VARCHAR(20) | PK | รหัส Log |
| SystemCode | VARCHAR(10) | รหัสระบบปลายทาง (FINANCE/PHARMACY/EXAM/INSURANCE) | |
| OperationType | VARCHAR(20) | ประเภทการทำงาน (SEND/RECEIVE/SYNC) | |
| RequestData | NTEXT | ข้อมูลที่ส่ง | |
| ResponseData | NTEXT | ข้อมูลที่ได้รับ | |
| Status | VARCHAR(20) | สถานะ (SUCCESS/FAILED/PENDING) | |
| ErrorMessage | NTEXT | ข้อความ Error | |
| ProcessedDate | DATETIME | วันที่ประมวลผล | |
| CreatedBy | VARCHAR(50) | ผู้ทำรายการ |
Table: API_ENDPOINTS (จุดเชื่อมต่อ API)
| Field | Type | Key | Description |
|---|---|---|---|
| EndpointID | VARCHAR(20) | PK | รหัส Endpoint |
| SystemCode | VARCHAR(10) | รหัสระบบ | |
| EndpointURL | VARCHAR(500) | URL ของ API | |
| Method | VARCHAR(10) | HTTP Method (GET/POST/PUT/DELETE) | |
| AuthType | VARCHAR(20) | ประเภทการ Authentication | |
| IsActive | BIT | ใช้งานได้ | |
| TimeoutSeconds | INT | Timeout ในหน่วยวินาที | |
| RetryCount | INT | จำนวนครั้งที่ Retry |
ระบบเวชระเบียนเป็นระบบหลักที่ระบบอื่นๆ จะอ้างอิงข้อมูลผู้ป่วยและการเข้ารับบริการ โดยมีการเชื่อมโยงดังนี้:
8.2.4.1 การเชื่อมโยงกับระบบการเงิน (1.2.14)
การอ้างอิงข้อมูลไปยังระบบการเงิน:
-- ระบบการเงินจะอ้างอิงข้อมูลจากระบบเวชระเบียน
FinancialSystem.BILLING (
BillingID VARCHAR(20) PK,
HN VARCHAR(10) FK → MedicalRecord.PATIENT.HN,
VisitID VARCHAR(20) FK → MedicalRecord.VISIT.VisitID,
-- ข้อมูลการเงินอื่นๆ
)
8.2.4.2 การเชื่อมโยงกับระบบตรวจสอบสิทธิ (1.2.15)
การอ้างอิงข้อมูลไปยังระบบตรวจสอบสิทธิ:
-- ระบบตรวจสอบสิทธิจะอ้างอิงข้อมูลผู้ป่วยจากระบบเวชระเบียน
RightsSystem.PATIENTRIGHT (
PatientRightID VARCHAR(20) PK,
HN VARCHAR(10) FK → MedicalRecord.PATIENT.HN,
-- ข้อมูลสิทธิอื่นๆ
)
-- ระบบเวชระเบียนจะอ้างอิงประเภทสิทธิจากระบบตรวจสอบสิทธิ
MedicalRecord.VISIT_RIGHTS (
RightTypeID VARCHAR(10) FK → RightsSystem.RIGHTTYPE.RightTypeID
)
8.2.4.3 การเชื่อมโยงกับระบบห้องตรวจแพทย์ (1.2.3)
การอ้างอิงข้อมูลไปยังระบบห้องตรวจ:
-- ระบบห้องตรวจจะอ้างอิงข้อมูลการส่งตรวจจากระบบเวชระเบียน
ExamRoomSystem.EXAMINATION (
ExamID VARCHAR(20) PK,
VisitID VARCHAR(20) FK → MedicalRecord.VISIT.VisitID,
HN VARCHAR(10) FK → MedicalRecord.PATIENT.HN,
-- ข้อมูลการตรวจอื่นๆ
)
8.2.4.4 การเชื่อมโยงกับระบบเภสัชกรรม (1.2.13)
การอ้างอิงข้อมูลไปยังระบบเภสัชกรรม:
-- ระบบเภสัชกรรมจะอ้างอิงข้อมูลผู้ป่วยและการเข้ารับบริการ
PharmacySystem.PRESCRIPTION (
PrescriptionID VARCHAR(20) PK,
HN VARCHAR(10) FK → MedicalRecord.PATIENT.HN,
VisitID VARCHAR(20) FK → MedicalRecord.VISIT.VisitID,
-- ข้อมูลใบสั่งยาอื่นๆ
)
8.2.4.5 การเชื่อมโยงกับระบบรังสีวิทยาและชันสูตร (1.2.7, 1.2.8)
การอ้างอิงข้อมูลไปยังระบบ Lab/X-Ray:
-- ระบบชันสูตรจะอ้างอิงข้อมูลผู้ป่วยและการเข้ารับบริการ
LabSystem.LAB_ORDER (
LabOrderID VARCHAR(20) PK,
HN VARCHAR(10) FK → MedicalRecord.PATIENT.HN,
VisitID VARCHAR(20) FK → MedicalRecord.VISIT.VisitID,
-- ข้อมูล Lab Order อื่นๆ
)
-- ระบบรังสีวิทยาจะอ้างอิงข้อมูลผู้ป่วยและการเข้ารับบริการ
RadiologySystem.XRAY_ORDER (
XrayOrderID VARCHAR(20) PK,
HN VARCHAR(10) FK → MedicalRecord.PATIENT.HN,
VisitID VARCHAR(20) FK → MedicalRecord.VISIT.VisitID,
-- ข้อมูล X-Ray Order อื่นๆ
)
8.2.4.6 การเชื่อมโยงกับระบบผู้ป่วยใน (1.2.17)
Table: ADMISSION (การรับเข้าผู้ป่วยใน)
วัตถุประสงค์: เก็บข้อมูลการรับผู้ป่วยเข้าพักรักษาใน รวมถึงการ Admit และ Discharge
| Field | Type | Key | Description |
|---|---|---|---|
| AN | VARCHAR(15) | PK | Admission Number |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| VisitID | VARCHAR(20) | FK | รหัส Visit ที่ทำการ Admit |
| AdmitDate | DATETIME | วันที่รับเข้า | |
| AdmitWard | NVARCHAR(50) | หอผู้ป่วยที่รับเข้า | |
| AdmitBed | VARCHAR(10) | เตียงที่รับเข้า | |
| AdmitDoctor | NVARCHAR(100) | แพทย์ที่รับเข้า | |
| AdmitDiagnosis | NTEXT | การวินิจฉัยเบื้องต้น | |
| DischargeDate | DATETIME | วันที่จำหน่าย | |
| DischargeType | VARCHAR(20) | ประเภทการจำหน่าย | |
| Status | VARCHAR(20) | สถานะ (ADMITTED/DISCHARGED/TRANSFERRED) | |
| CreatedDate | DATETIME | วันที่บันทึก | |
| CreatedBy | VARCHAR(50) | ผู้บันทึก |
8.2.4.7 การเชื่อมโยงกับระบบนัดหมายและตารางเวรแพทย์ (1.2.6)
การอ้างอิงข้อมูลไปยังระบบนัดหมาย:
-- ระบบนัดหมายจะอ้างอิงข้อมูลผู้ป่วยและการนัดหมายจากระบบเวชระเบียน
ScheduleSystem.DOCTOR_APPOINTMENT (
DoctorAppointmentID VARCHAR(20) PK,
AppointmentID VARCHAR(20) FK → MedicalRecord.APPOINTMENT.AppointmentID,
HN VARCHAR(10) FK → MedicalRecord.PATIENT.HN,
DoctorScheduleID VARCHAR(20), -- อ้างอิงตารางเวรแพทย์
-- ข้อมูลอื่นๆ
)
Integration Notes:
การแยกขอบเขตความรับผิดชอบ (Separation of Concerns):
- ระบบเวชระเบียน (1.2.1) = ระบบหลักที่เก็บข้อมูลผู้ป่วยและการเข้ารับบริการพื้นฐาน
- ระบบอื่นๆ = อ้างอิงข้อมูลจากระบบเวชระเบียนผ่าน Foreign Key HN และ VisitID
หลักการอ้างอิง: ระบบเวชระเบียนจะเป็น Master Data สำหรับข้อมูลผู้ป่วย (HN) และการเข้ารับบริการ (VisitID) ที่ระบบอื่นๆ จะอ้างอิงเป็นหลัก
ความสอดคล้องกับ TOR: ตาม TOR 1.2.1.2 ข้อ 11 "สามารถยืมแฟ้มเวชระเบียนอัตโนมัติเมื่อบันทึกส่งตรวจ" และข้อ 13 "สามารถส่งตรวจผู้ป่วยได้มากกว่า 1 แผนก" ระบบจะต้องสามารถเชื่อมโยงกับระบบอื่นๆ ได้อย่างราบรื่น
8.2.5 ความสัมพันธ์ระหว่างตาราง (Relationships)
🎨 คำอธิบายสีในแผนภาพ:
- 🟢 สีเขียว (Core Tables): ตารางหลักของระบบเวชระเบียน ที่เก็บข้อมูลผู้ป่วยและการทำงานหลัก
- PATIENT - ข้อมูลผู้ป่วยหลัก
- VISIT - ข้อมูลการเข้ารับบริการ
- ADMISSION - ข้อมูลการรับผู้ป่วยใน
- 🔵 สีน้ำเงิน (Support Tables): ตารางสนับสนุนการทำงานและข้อมูลย่อย
PATIENT_ADDRESS,PATIENT_CONTACT- ข้อมูลที่อยู่และผู้ติดต่อPATIENT_MEDICAL_HISTORY,PATIENT_FAMILY_INFO- ข้อมูลประวัติ-
CHART_BORROWING,APPOINTMENT- การจัดการแฟ้มและนัดหมาย -
🟠 สีส้ม (System Tables): ตารางจัดการระบบและการตรวจสอบ
HN_HISTORY,AUDIT_LOG- บันทึกการเปลี่ยนแปลงPATIENT_NOTES,SYSTEM_CONFIG- หมายเหตุและการตั้งค่าSYSTEM_INTEGRATION_LOG,API_ENDPOINTS- การเชื่อมโยงระบบ
📋 Entity Relationship Diagram (ERD)
สำหรับ ERD แบบละเอียดและแผนภาพความสัมพันธ์ระหว่างตารางทั้งหมด กรุณาดูไฟล์:
ไฟล์ดังกล่าวประกอบด้วย: - แผนภาพแบบง่าย (Simplified Diagram) - ERD แบบละเอียด (Detailed ERD) - Integration Architecture Diagram - Database Relationships Summary
สรุปความสัมพันธ์หลัก:
- PATIENT เป็นตารางหลักที่เชื่อมโยงกับตารางอื่นๆ ผ่าน
HN - VISIT เก็บข้อมูลการเข้ารับบริการ เชื่อมโยงกับ PATIENT ผ่าน
HN - Master Data Tables ให้ข้อมูลอ้างอิงสำหรับ dropdown และ validation
- Integration Tables จัดการการเชื่อมต่อกับระบบอื่นผ่าน API
🔗 ความสัมพันธ์การ Integration:
- ระบบเวชระเบียนเป็น Master Data Source สำหรับ HN และ VisitID
- ระบบอื่นๆ อ้างอิงข้อมูลผ่าน API Integration
- การติดตาม API calls ผ่าน SYSTEM_INTEGRATION_LOG
- การจัดการ endpoints ผ่าน API_ENDPOINTS
8.2.6 Index และ Constraints
Primary Keys (ตารางหลักของระบบเวชระเบียน): - PATIENT.HN (PK) - VISIT.VisitID (PK) - ADMISSION.AN (PK) - PATIENT_ADDRESS.AddressID (PK) - PATIENT_CONTACT.ContactID (PK) - CHART_BORROWING.BorrowingID (PK) - APPOINTMENT.AppointmentID (PK)
Foreign Keys (ความสัมพันธ์ภายในระบบ):
-- ความสัมพันธ์หลักของผู้ป่วย
ALTER TABLE PATIENT
ADD CONSTRAINT FK_PATIENT_TITLE
FOREIGN KEY (TitleID) REFERENCES TITLE_NAME(TitleID);
ALTER TABLE PATIENT
ADD CONSTRAINT FK_PATIENT_GENDER
FOREIGN KEY (GenderCode) REFERENCES GENDER(GenderCode);
ALTER TABLE PATIENT
ADD CONSTRAINT FK_PATIENT_BLOODGROUP
FOREIGN KEY (BloodGroupID) REFERENCES BLOOD_GROUP(BloodGroupID);
ALTER TABLE PATIENT
ADD CONSTRAINT FK_PATIENT_MARITAL
FOREIGN KEY (MaritalStatusCode) REFERENCES MARITAL_STATUS(MaritalStatusCode);
ALTER TABLE PATIENT
ADD CONSTRAINT FK_PATIENT_RACE
FOREIGN KEY (RaceCode) REFERENCES RACE(RaceCode);
ALTER TABLE PATIENT
ADD CONSTRAINT FK_PATIENT_NATIONALITY
FOREIGN KEY (NationalityCode) REFERENCES NATIONALITY(NationalityCode);
ALTER TABLE PATIENT
ADD CONSTRAINT FK_PATIENT_OCCUPATION
FOREIGN KEY (OccupationGroupCode) REFERENCES OCCUPATION_GROUP(OccupationGroupCode);
ALTER TABLE PATIENT
ADD CONSTRAINT FK_PATIENT_RELIGION
FOREIGN KEY (ReligionID) REFERENCES RELIGION(ReligionID);
-- ความสัมพันธ์ของที่อยู่
ALTER TABLE PATIENT_ADDRESS
ADD CONSTRAINT FK_PATIENT_ADDRESS_HN
FOREIGN KEY (HN) REFERENCES PATIENT(HN);
ALTER TABLE PATIENT_ADDRESS
ADD CONSTRAINT FK_PATIENT_ADDRESS_SUBDISTRICT
FOREIGN KEY (SubdistrictCode) REFERENCES SUBDISTRICT(SubdistrictCode);
ALTER TABLE PATIENT_ADDRESS
ADD CONSTRAINT FK_PATIENT_ADDRESS_DISTRICT
FOREIGN KEY (DistrictCode) REFERENCES DISTRICT(DistrictCode);
ALTER TABLE PATIENT_ADDRESS
ADD CONSTRAINT FK_PATIENT_ADDRESS_PROVINCE
FOREIGN KEY (ProvinceCode) REFERENCES PROVINCE(ProvinceCode);
-- ความสัมพันธ์ของผู้ติดต่อ
ALTER TABLE PATIENT_CONTACT
ADD CONSTRAINT FK_PATIENT_CONTACT_HN
FOREIGN KEY (HN) REFERENCES PATIENT(HN);
ALTER TABLE PATIENT_CONTACT
ADD CONSTRAINT FK_PATIENT_CONTACT_RELATIONSHIP
FOREIGN KEY (RelationshipCode) REFERENCES RELATIONSHIP(RelationshipCode);
-- ความสัมพันธ์ของข้อมูลครอบครัว
ALTER TABLE PATIENT_FAMILY_INFO
ADD CONSTRAINT FK_PATIENT_FAMILY_HN
FOREIGN KEY (HN) REFERENCES PATIENT(HN);
ALTER TABLE PATIENT_FAMILY_INFO
ADD CONSTRAINT FK_PATIENT_FAMILY_EDUCATION
FOREIGN KEY (EducationLevelCode) REFERENCES EDUCATION_LEVEL(EducationLevelCode);
ALTER TABLE PATIENT_MEDICAL_HISTORY
ADD CONSTRAINT FK_PATIENT_MEDICAL_HISTORY_HN
FOREIGN KEY (HN) REFERENCES PATIENT(HN);
ALTER TABLE PATIENT_OFFICER_INFO
ADD CONSTRAINT FK_PATIENT_OFFICER_HN
FOREIGN KEY (HN) REFERENCES PATIENT(HN);
ALTER TABLE PATIENT_ALIEN_INFO
ADD CONSTRAINT FK_PATIENT_ALIEN_HN
FOREIGN KEY (HN) REFERENCES PATIENT(HN);
-- ความสัมพันธ์ของการมารับบริการ
ALTER TABLE VISIT
ADD CONSTRAINT FK_VISIT_HN
FOREIGN KEY (HN) REFERENCES PATIENT(HN);
ALTER TABLE VISIT
ADD CONSTRAINT FK_VISIT_TYPE
FOREIGN KEY (VisitTypeCode) REFERENCES VISIT_TYPE(VisitTypeCode);
ALTER TABLE VISIT
ADD CONSTRAINT FK_VISIT_PATIENT_TYPE
FOREIGN KEY (PatientTypeCode) REFERENCES PATIENT_TYPE(PatientTypeCode);
ALTER TABLE VISIT
ADD CONSTRAINT FK_VISIT_URGENCY
FOREIGN KEY (UrgencyCode) REFERENCES URGENCY_LEVEL(UrgencyCode);
ALTER TABLE VISIT
ADD CONSTRAINT FK_VISIT_CONDITION
FOREIGN KEY (ConditionCode) REFERENCES PATIENT_CONDITION(ConditionCode);
ALTER TABLE VISIT
ADD CONSTRAINT FK_VISIT_DEPARTMENT
FOREIGN KEY (DepartmentCode) REFERENCES DEPARTMENT(DepartmentCode);
ALTER TABLE VISIT
ADD CONSTRAINT FK_VISIT_ROOM
FOREIGN KEY (RoomCode) REFERENCES ROOM(RoomCode);
ALTER TABLE ADMISSION
ADD CONSTRAINT FK_ADMISSION_HN
FOREIGN KEY (HN) REFERENCES PATIENT(HN);
ALTER TABLE ADMISSION
ADD CONSTRAINT FK_ADMISSION_VISIT
FOREIGN KEY (VisitID) REFERENCES VISIT(VisitID);
-- ความสัมพันธ์ของการยืมแฟ้ม
ALTER TABLE CHART_BORROWING
ADD CONSTRAINT FK_CHART_BORROWING_HN
FOREIGN KEY (HN) REFERENCES PATIENT(HN);
ALTER TABLE CHART_BORROWING
ADD CONSTRAINT FK_CHART_BORROWING_VISIT
FOREIGN KEY (VisitID) REFERENCES VISIT(VisitID);
ALTER TABLE CHART_BORROWING
ADD CONSTRAINT FK_CHART_BORROWING_AN
FOREIGN KEY (AN) REFERENCES ADMISSION(AN);
-- ความสัมพันธ์ของการนัดหมาย
ALTER TABLE APPOINTMENT
ADD CONSTRAINT FK_APPOINTMENT_HN
FOREIGN KEY (HN) REFERENCES PATIENT(HN);
ALTER TABLE APPOINTMENT
ADD CONSTRAINT FK_APPOINTMENT_DEPARTMENT
FOREIGN KEY (DepartmentCode) REFERENCES DEPARTMENT(DepartmentCode);
ALTER TABLE APPOINTMENT
ADD CONSTRAINT FK_APPOINTMENT_ROOM
FOREIGN KEY (RoomCode) REFERENCES ROOM(RoomCode);
ALTER TABLE APPOINTMENT
ADD CONSTRAINT FK_APPOINTMENT_TYPE
FOREIGN KEY (AppointmentTypeCode) REFERENCES APPOINTMENT_TYPE(AppointmentTypeCode);
ALTER TABLE APPOINTMENT
ADD CONSTRAINT FK_APPOINTMENT_STATUS
FOREIGN KEY (StatusCode) REFERENCES APPOINTMENT_STATUS(StatusCode);
-- ความสัมพันธ์ของประวัติและหมายเหตุ
ALTER TABLE HN_HISTORY
ADD CONSTRAINT FK_HN_HISTORY_CURRENT
FOREIGN KEY (CurrentHN) REFERENCES PATIENT(HN);
ALTER TABLE PATIENT_NOTES
ADD CONSTRAINT FK_PATIENT_NOTES_HN
FOREIGN KEY (HN) REFERENCES PATIENT(HN);
-- ความสัมพันธ์ของ Master Data ภูมิศาสตร์
ALTER TABLE PROVINCE
ADD CONSTRAINT FK_PROVINCE_REGION
FOREIGN KEY (RegionID) REFERENCES REGION(RegionID);
ALTER TABLE DISTRICT
ADD CONSTRAINT FK_DISTRICT_PROVINCE
FOREIGN KEY (ProvinceCode) REFERENCES PROVINCE(ProvinceCode);
ALTER TABLE SUBDISTRICT
ADD CONSTRAINT FK_SUBDISTRICT_DISTRICT
FOREIGN KEY (DistrictCode) REFERENCES DISTRICT(DistrictCode);
-- ความสัมพันธ์ของแผนก/ห้อง
ALTER TABLE DEPARTMENT
ADD CONSTRAINT FK_DEPARTMENT_PARENT
FOREIGN KEY (ParentDepartmentCode) REFERENCES DEPARTMENT(DepartmentCode);
ALTER TABLE ROOM
ADD CONSTRAINT FK_ROOM_DEPARTMENT
FOREIGN KEY (DepartmentCode) REFERENCES DEPARTMENT(DepartmentCode);
Foreign Keys (การเชื่อมต่อกับระบบอื่น):
-- การอ้างอิงไปยังระบบตรวจสอบสิทธิ
ALTER TABLE VISIT_RIGHTS
ADD CONSTRAINT FK_VISIT_RIGHTS_RIGHTTYPE
FOREIGN KEY (RightTypeID) REFERENCES RightsSystem.RIGHTTYPE(RightTypeID);
Indexes (สำหรับประสิทธิภาพการค้นหา):
-- Indexes สำหรับการค้นหาผู้ป่วย (ตาม TOR 1.2.1.1 ข้อ 19 และ 1.2.1.2 ข้อ 1)
CREATE INDEX IX_PATIENT_CITIZENID ON PATIENT(CitizenID);
CREATE INDEX IX_PATIENT_FIRSTNAME ON PATIENT(FirstName);
CREATE INDEX IX_PATIENT_LASTNAME ON PATIENT(LastName);
CREATE INDEX IX_PATIENT_FULLNAME ON PATIENT(FirstName, LastName);
CREATE INDEX IX_PATIENT_PASSPORTNUMBER ON PATIENT(PassportNumber);
CREATE INDEX IX_PATIENT_ALIENID ON PATIENT(AlienID);
CREATE INDEX IX_PATIENT_TITLE ON PATIENT(TitleID);
CREATE INDEX IX_PATIENT_GENDER ON PATIENT(GenderCode);
CREATE INDEX IX_PATIENT_BLOODGROUP ON PATIENT(BloodGroupID);
-- Indexes สำหรับการใช้งานประจำ
CREATE INDEX IX_VISIT_DATE ON VISIT(VisitDate);
CREATE INDEX IX_VISIT_STATUS ON VISIT(Status);
CREATE INDEX IX_VISIT_DEPARTMENT ON VISIT(DepartmentCode);
CREATE INDEX IX_VISIT_HN_DATE ON VISIT(HN, VisitDate);
CREATE INDEX IX_VISIT_TYPE ON VISIT(VisitTypeCode);
CREATE INDEX IX_VISIT_URGENCY ON VISIT(UrgencyCode);
CREATE INDEX IX_ADMISSION_DATE ON ADMISSION(AdmitDate);
CREATE INDEX IX_ADMISSION_WARD ON ADMISSION(AdmitWard);
CREATE INDEX IX_ADMISSION_STATUS ON ADMISSION(Status);
CREATE INDEX IX_CHART_BORROWING_STATUS ON CHART_BORROWING(Status);
CREATE INDEX IX_CHART_BORROWING_DATE ON CHART_BORROWING(BorrowDate);
CREATE INDEX IX_CHART_BORROWING_BARCODE ON CHART_BORROWING(BarcodeID);
CREATE INDEX IX_APPOINTMENT_DATE ON APPOINTMENT(AppointmentDate);
CREATE INDEX IX_APPOINTMENT_STATUS ON APPOINTMENT(StatusCode);
CREATE INDEX IX_APPOINTMENT_DEPARTMENT ON APPOINTMENT(DepartmentCode);
CREATE INDEX IX_APPOINTMENT_TYPE ON APPOINTMENT(AppointmentTypeCode);
-- Indexes สำหรับ Master Data Lookup
CREATE INDEX IX_TITLE_NAME_CODE ON TITLE_NAME(TitleCode);
CREATE INDEX IX_TITLE_NAME_CATEGORY ON TITLE_NAME(Category);
CREATE INDEX IX_BLOODGROUP_GROUP ON BLOOD_GROUP(BloodGroup);
CREATE INDEX IX_PROVINCE_REGION ON PROVINCE(RegionID);
CREATE INDEX IX_DISTRICT_PROVINCE ON DISTRICT(ProvinceCode);
CREATE INDEX IX_SUBDISTRICT_DISTRICT ON SUBDISTRICT(DistrictCode);
CREATE INDEX IX_SUBDISTRICT_POSTAL ON SUBDISTRICT(PostalCode);
CREATE INDEX IX_DEPARTMENT_TYPE ON DEPARTMENT(DepartmentType);
CREATE INDEX IX_ROOM_DEPARTMENT ON ROOM(DepartmentCode);
CREATE INDEX IX_ROOM_TYPE ON ROOM(RoomType);
-- Indexes สำหรับ Address Lookup
CREATE INDEX IX_PATIENT_ADDRESS_SUBDISTRICT ON PATIENT_ADDRESS(SubdistrictCode);
CREATE INDEX IX_PATIENT_ADDRESS_DISTRICT ON PATIENT_ADDRESS(DistrictCode);
CREATE INDEX IX_PATIENT_ADDRESS_PROVINCE ON PATIENT_ADDRESS(ProvinceCode);
CREATE INDEX IX_PATIENT_ADDRESS_POSTAL ON PATIENT_ADDRESS(PostalCode);
-- Indexes สำหรับ Audit และ Security
CREATE INDEX IX_AUDIT_LOG_DATE ON AUDIT_LOG(ChangeDate);
CREATE INDEX IX_AUDIT_LOG_USER ON AUDIT_LOG(UserID);
CREATE INDEX IX_AUDIT_LOG_HN ON AUDIT_LOG(HN);
Unique Constraints:
-- ป้องกันข้อมูลซ้ำ (ตาม TOR 1.2.1.1 การป้องกันข้อมูลซ้ำซ้อน)
ALTER TABLE PATIENT
ADD CONSTRAINT UQ_PATIENT_CITIZENID UNIQUE (CitizenID);
ALTER TABLE PATIENT
ADD CONSTRAINT UQ_PATIENT_PASSPORTNUMBER UNIQUE (PassportNumber);
ALTER TABLE PATIENT
ADD CONSTRAINT UQ_PATIENT_ALIENID UNIQUE (AlienID);
-- ป้องกันการยืมแฟ้มซ้ำ
ALTER TABLE CHART_BORROWING
ADD CONSTRAINT UQ_CHART_BORROWING_ACTIVE
UNIQUE (HN, Status)
WHERE Status = 'BORROWED';
Check Constraints:
-- ตรวจสอบความถูกต้องของข้อมูล
ALTER TABLE PATIENT
ADD CONSTRAINT CHK_PATIENT_GENDER
CHECK (Gender IN ('M', 'F', 'O'));
ALTER TABLE PATIENT
ADD CONSTRAINT CHK_PATIENT_AGE
CHECK (Age >= 0 AND Age <= 150);
ALTER TABLE VISIT
ADD CONSTRAINT CHK_VISIT_TYPE
CHECK (VisitType IN ('OPD', 'IPD', 'ER', 'PCU', 'UNIT'));
ALTER TABLE VISIT
ADD CONSTRAINT CHK_VISIT_URGENCY
CHECK (Urgency IN ('HIGHEST', 'HIGH', 'NORMAL'));
ALTER TABLE CHART_BORROWING
ADD CONSTRAINT CHK_CHART_STATUS
CHECK (Status IN ('BORROWED', 'RETURNED', 'OVERDUE', 'LOST'));
ALTER TABLE APPOINTMENT
ADD CONSTRAINT CHK_APPOINTMENT_STATUS
CHECK (Status IN ('SCHEDULED', 'CONFIRMED', 'COMPLETED', 'CANCELLED', 'NOSHOW'));
8.2.7 Views สำหรับการใช้งาน
Views สำหรับการแสดงข้อมูลรวม:
-- View ข้อมูลผู้ป่วยพร้อมที่อยู่หลักและ Master Data
CREATE VIEW PatientWithAddressView AS
SELECT
p.HN, p.CitizenID,
t.TitleNameTH + p.FirstName + ' ' + p.LastName AS FullNameTH,
t.TitleNameEN + p.FirstName + ' ' + p.LastName AS FullNameEN,
g.GenderNameTH, g.GenderNameEN,
p.DateOfBirth, p.Age,
bg.DisplayName AS BloodGroupDisplay, bg.NameTH AS BloodGroupTH,
ms.MaritalStatusNameTH, ms.MaritalStatusNameEN,
r.RaceNameTH, r.RaceNameEN,
n.NationalityNameTH, n.NationalityNameEN,
og.OccupationGroupNameTH, p.OccupationDetail,
rel.ReligionNameTH, rel.ReligionNameEN,
pa.HouseNumber, pa.VillageNumber, pa.Street,
sd.SubdistrictNameTH, d.DistrictNameTH, pr.ProvinceNameTH,
pa.PostalCode, pa.PhoneNumber, pa.Email,
p.IsDeceased, p.CreatedDate
FROM
PATIENT p
LEFT JOIN TITLE_NAME t ON p.TitleID = t.TitleID
LEFT JOIN GENDER g ON p.GenderCode = g.GenderCode
LEFT JOIN BLOOD_GROUP bg ON p.BloodGroupID = bg.BloodGroupID
LEFT JOIN MARITAL_STATUS ms ON p.MaritalStatusCode = ms.MaritalStatusCode
LEFT JOIN RACE r ON p.RaceCode = r.RaceCode
LEFT JOIN NATIONALITY n ON p.NationalityCode = n.NationalityCode
LEFT JOIN OCCUPATION_GROUP og ON p.OccupationGroupCode = og.OccupationGroupCode
LEFT JOIN RELIGION rel ON p.ReligionID = rel.ReligionID
LEFT JOIN PATIENT_ADDRESS pa ON p.HN = pa.HN AND pa.IsDefault = 1
LEFT JOIN SUBDISTRICT sd ON pa.SubdistrictCode = sd.SubdistrictCode
LEFT JOIN DISTRICT d ON pa.DistrictCode = d.DistrictCode
LEFT JOIN PROVINCE pr ON pa.ProvinceCode = pr.ProvinceCode;
-- View ข้อมูลการเข้ารับบริการพร้อม Master Data
CREATE VIEW PatientVisitView AS
SELECT
v.VisitID, v.HN, v.VisitDate,
vt.VisitTypeNameTH, vt.VisitTypeNameEN,
pt.PatientTypeNameTH, pt.PatientTypeNameEN,
ul.UrgencyNameTH, ul.UrgencyNameEN, ul.Priority, ul.ColorCode AS UrgencyColor,
pc.ConditionNameTH, pc.ConditionNameEN,
v.ChiefComplaint, v.QueueNumber,
d.DepartmentNameTH, d.DepartmentNameEN,
rm.RoomNameTH, rm.RoomNameEN,
v.Doctor, v.Status, v.IsAdvanceBooking,
t.TitleNameTH + p.FirstName + ' ' + p.LastName AS PatientNameTH,
p.CitizenID, p.Age,
g.GenderNameTH, bg.DisplayName AS BloodGroup
FROM
VISIT v
INNER JOIN PATIENT p ON v.HN = p.HN
LEFT JOIN TITLE_NAME t ON p.TitleID = t.TitleID
LEFT JOIN GENDER g ON p.GenderCode = g.GenderCode
LEFT JOIN BLOOD_GROUP bg ON p.BloodGroupID = bg.BloodGroupID
LEFT JOIN VISIT_TYPE vt ON v.VisitTypeCode = vt.VisitTypeCode
LEFT JOIN PATIENT_TYPE pt ON v.PatientTypeCode = pt.PatientTypeCode
LEFT JOIN URGENCY_LEVEL ul ON v.UrgencyCode = ul.UrgencyCode
LEFT JOIN PATIENT_CONDITION pc ON v.ConditionCode = pc.ConditionCode
LEFT JOIN DEPARTMENT d ON v.DepartmentCode = d.DepartmentCode
LEFT JOIN ROOM rm ON v.RoomCode = rm.RoomCode;
-- View สถานะแฟ้มเวชระเบียน (ตาม TOR 1.2.1.4)
CREATE VIEW ChartStatusView AS
SELECT
p.HN, t.TitleNameTH + p.FirstName + ' ' + p.LastName AS PatientNameTH,
cb.BorrowingID, cb.ChartType, cb.BorrowDate, cb.BorrowTime,
cb.BorrowerID, cb.BorrowDepartment, cb.BorrowReason,
cb.ReturnDate, cb.ReturnTime, cb.Status,
cl.CurrentLocation, cl.LocationType,
CASE
WHEN cb.Status = 'BORROWED' THEN 'ถูกยืม'
WHEN cb.Status = 'RETURNED' THEN 'คืนแล้ว'
WHEN cb.Status = 'OVERDUE' THEN 'เกินกำหนด'
WHEN cb.Status = 'LOST' THEN 'สูญหาย'
ELSE 'ไม่ระบุ'
END AS StatusThai
FROM
PATIENT p
LEFT JOIN TITLE_NAME t ON p.TitleID = t.TitleID
LEFT JOIN CHART_BORROWING cb ON p.HN = cb.HN AND cb.Status IN ('BORROWED', 'OVERDUE')
LEFT JOIN CHART_LOCATION cl ON p.HN = cl.HN;
-- View การนัดหมายพร้อม Master Data (ตาม TOR 1.2.1.5)
CREATE VIEW AppointmentView AS
SELECT
a.AppointmentID, a.HN, a.AppointmentDate, a.AppointmentTime,
d.DepartmentNameTH, d.DepartmentNameEN,
rm.RoomNameTH, rm.RoomNameEN,
a.DoctorID,
at.AppointmentTypeNameTH, at.AppointmentTypeNameEN, at.ColorCode AS TypeColor,
ast.StatusNameTH, ast.StatusNameEN, ast.ColorCode AS StatusColor,
a.IsChartPrepared, a.Notes,
t.TitleNameTH + p.FirstName + ' ' + p.LastName AS PatientNameTH,
p.CitizenID, p.Age, g.GenderNameTH,
pa.PhoneNumber
FROM
APPOINTMENT a
INNER JOIN PATIENT p ON a.HN = p.HN
LEFT JOIN TITLE_NAME t ON p.TitleID = t.TitleID
LEFT JOIN GENDER g ON p.GenderCode = g.GenderCode
LEFT JOIN DEPARTMENT d ON a.DepartmentCode = d.DepartmentCode
LEFT JOIN ROOM rm ON a.RoomCode = rm.RoomCode
LEFT JOIN APPOINTMENT_TYPE at ON a.AppointmentTypeCode = at.AppointmentTypeCode
LEFT JOIN APPOINTMENT_STATUS ast ON a.StatusCode = ast.StatusCode
LEFT JOIN PATIENT_ADDRESS pa ON p.HN = pa.HN AND pa.IsDefault = 1;
-- View ประวัติการเปลี่ยน HN (ตาม TOR 1.2.1.6)
CREATE VIEW HNHistoryView AS
SELECT
hh.HNHistoryID, hh.CurrentHN, hh.OldHN, hh.ChangeType,
hh.ChangeReason, hh.ChangeDate, hh.ChangedBy, hh.ApprovedBy,
t.TitleNameTH + p.FirstName + ' ' + p.LastName AS PatientNameTH,
p.CitizenID
FROM
HN_HISTORY hh
LEFT JOIN PATIENT p ON hh.CurrentHN = p.HN
LEFT JOIN TITLE_NAME t ON p.TitleID = t.TitleID;
-- View รายงานการยืมแฟ้มค้างส่ง (ตาม TOR 1.2.1.4 ข้อ 2)
CREATE VIEW OverdueChartView AS
SELECT
cb.BorrowingID, cb.HN, cb.ChartType, cb.BorrowDate,
cb.BorrowerID, cb.BorrowDepartment, cb.BorrowerPhone,
t.TitleNameTH + p.FirstName + ' ' + p.LastName AS PatientNameTH,
DATEDIFF(DAY, cb.BorrowDate, GETDATE()) AS DaysOverdue
FROM
CHART_BORROWING cb
INNER JOIN PATIENT p ON cb.HN = p.HN
LEFT JOIN TITLE_NAME t ON p.TitleID = t.TitleID
WHERE
cb.Status = 'BORROWED'
AND DATEDIFF(DAY, cb.BorrowDate, GETDATE()) > 7; -- เกิน 7 วันถือว่าค้าง
-- View ข้อมูลครอบครัวและการศึกษา
CREATE VIEW PatientFamilyEducationView AS
SELECT
pfi.HN,
t.TitleNameTH + p.FirstName + ' ' + p.LastName AS PatientNameTH,
pfi.FamilyStatus, pfi.PersonStatus, pfi.PersonType, pfi.CommunityPosition,
el.EducationLevelNameTH, el.EducationLevelNameEN,
og.OccupationGroupNameTH, p.OccupationDetail
FROM
PATIENT_FAMILY_INFO pfi
INNER JOIN PATIENT p ON pfi.HN = p.HN
LEFT JOIN TITLE_NAME t ON p.TitleID = t.TitleID
LEFT JOIN EDUCATION_LEVEL el ON pfi.EducationLevelCode = el.EducationLevelCode
LEFT JOIN OCCUPATION_GROUP og ON p.OccupationGroupCode = og.OccupationGroupCode;
8.2.8 Stored Procedures สำหรับฟังก์ชันพิเศษ
-- Procedure สำหรับการรวม HN (ตาม TOR 1.2.1.6 ข้อ 1)
CREATE PROCEDURE sp_MergeHN
@SourceHN VARCHAR(10),
@TargetHN VARCHAR(10),
@UserID VARCHAR(50),
@Reason NTEXT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRANSACTION;
TRY
-- บันทึกประวัติการรวม HN
INSERT INTO HN_HISTORY (HNHistoryID, CurrentHN, OldHN, ChangeType, ChangeReason, ChangeDate, ChangedBy)
VALUES (NEWID(), @TargetHN, @SourceHN, 'MERGE', @Reason, GETDATE(), @UserID);
-- ย้ายข้อมูล Visit
UPDATE VISIT SET HN = @TargetHN WHERE HN = @SourceHN;
-- ย้ายข้อมูล Chart Borrowing
UPDATE CHART_BORROWING SET HN = @TargetHN WHERE HN = @SourceHN;
-- ย้ายข้อมูลอื่นๆ
UPDATE PATIENT_ADDRESS SET HN = @TargetHN WHERE HN = @SourceHN;
UPDATE PATIENT_CONTACT SET HN = @TargetHN WHERE HN = @SourceHN;
UPDATE PATIENT_MEDICAL_HISTORY SET HN = @TargetHN WHERE HN = @SourceHN;
UPDATE APPOINTMENT SET HN = @TargetHN WHERE HN = @SourceHN;
UPDATE PATIENT_NOTES SET HN = @TargetHN WHERE HN = @SourceHN;
-- ลบ Patient เดิม
DELETE FROM PATIENT WHERE HN = @SourceHN;
COMMIT TRANSACTION;
SELECT 'SUCCESS' AS Result, 'HN Merged Successfully' AS Message;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
SELECT 'ERROR' AS Result, ERROR_MESSAGE() AS Message;
END CATCH
END;
-- Procedure สำหรับการคำนวณอายุ (ตาม TOR 1.2.1.1 ข้อ 9, 10)
CREATE PROCEDURE sp_CalculateAge
@DateOfBirth DATE,
@Age INT OUTPUT,
@AgeInDays INT OUTPUT
AS
BEGIN
SET @Age = DATEDIFF(YEAR, @DateOfBirth, GETDATE()) -
CASE WHEN DATEADD(YEAR, DATEDIFF(YEAR, @DateOfBirth, GETDATE()), @DateOfBirth) > GETDATE()
THEN 1 ELSE 0 END;
SET @AgeInDays = DATEDIFF(DAY, @DateOfBirth, GETDATE());
END;
การแยกฟีเจอร์เพื่อลดการซ้ำซ้อน (Feature Separation)
ฟีเจอร์ที่ย้ายไประบบอื่น
🔄 ย้ายไประบบซักประวัติ (1.2.2)
- การจัดการประวัติการแพ้ยารายละเอียด (Drug Allergy Management)
- การบันทึก Chief Complaint และ History Taking
- การจัดการ Vital Signs และ Physical Examination
- การบันทึกการสั่ง Lab/X-Ray รายละเอียด
💊 ย้ายไประบบเภสัชกรรม (1.2.13)
- การสั่งจ่ายยาและเวชภัณฑ์
- การตรวจสอบ Drug Interaction
- การจัดการ Prescription Template
- การพิมพ์ใบสั่งยา
🏥 ย้ายไประบบห้องตรวจแพทย์ (1.2.3)
- การจัดการคิวผู้ป่วยรายละเอียด
- การเรียกผู้ป่วยเข้าตรวจ
- การบันทึกผลการตรวจ
🔐 ย้ายไประบบตรวจสอบสิทธิ (1.2.15)
- การตรวจสอบสิทธิออนไลน์
- การยืนยันสิทธิกับหน่วยงานภายนอก
- การจัดการข้อมูลสิทธิรายละเอียด
API Integration Points
// Medical Record API Interface
interface MedicalRecordAPI {
// การส่งข้อมูลไประบบอื่น
sendToInsurance(patientData: PatientVisit): Promise<InsuranceResponse>
sendToFinance(visitData: VisitBilling): Promise<BillCalculation>
sendToPharmacy(visitId: string): Promise<PrescriptionStatus>
sendToExamRoom(queueData: ExamQueue): Promise<QueueStatus>
// การรับข้อมูลจากระบบอื่น
getInsuranceRights(patientId: string): Promise<RightsList>
getExamResults(visitId: string): Promise<ExamSummary>
getPrescriptionStatus(visitId: string): Promise<DrugOrderStatus>
getBillingStatus(visitId: string): Promise<PaymentStatus>
}
สรุปการปรับปรุง Schema ให้สอดคล้องกับ Master Data
การเปลี่ยนแปลงหลัก
1. เพิ่ม Master Data Tables ใหม่
- ตารางข้อมูลส่วนบุคคล:
TITLE_NAME,GENDER,BLOOD_GROUP,MARITAL_STATUS,RACE,NATIONALITY,RELIGION - ตารางการศึกษาและอาชีพ:
EDUCATION_LEVEL,OCCUPATION_GROUP - ตารางภูมิศาสตร์:
REGION,PROVINCE,DISTRICT,SUBDISTRICT - ตารางระบบสุขภาพ:
PATIENT_TYPE,VISIT_TYPE,URGENCY_LEVEL,PATIENT_CONDITION - ตารางความสัมพันธ์:
RELATIONSHIP - ตารางหน่วยงาน:
DEPARTMENT,ROOM - ตารางการนัดหมาย:
APPOINTMENT_TYPE,APPOINTMENT_STATUS
2. ปรับปรุงตาราง PATIENT เป็น Normalized Form
เปลี่ยนจาก direct text values เป็น Foreign Keys:
- TitleName → TitleID (FK to TITLE_NAME)
- Gender → GenderCode (FK to GENDER)
- BloodGroup → BloodGroupID (FK to BLOOD_GROUP)
- MaritalStatus → MaritalStatusCode (FK to MARITAL_STATUS)
- Race → RaceCode (FK to RACE)
- Nationality → NationalityCode (FK to NATIONALITY)
- Occupation → OccupationGroupCode (FK to OCCUPATION_GROUP) + OccupationDetail
- Religion → ReligionID (FK to RELIGION)
3. ปรับปรุงตาราง PATIENT_ADDRESS
Subdistrict→SubdistrictCode(FK to SUBDISTRICT)District→DistrictCode(FK to DISTRICT)Province→ProvinceCode(FK to PROVINCE)Country→CountryCode
4. ปรับปรุงตาราง VISIT
VisitType→VisitTypeCode(FK to VISIT_TYPE)PatientType→PatientTypeCode(FK to PATIENT_TYPE)Urgency→UrgencyCode(FK to URGENCY_LEVEL)PatientCondition→ConditionCode(FK to PATIENT_CONDITION)Department→DepartmentCode(FK to DEPARTMENT)Room→RoomCode(FK to ROOM)
5. ปรับปรุงตาราง APPOINTMENT
Department→DepartmentCode(FK to DEPARTMENT)AppointmentType→AppointmentTypeCode(FK to APPOINTMENT_TYPE)Status→StatusCode(FK to APPOINTMENT_STATUS)
ประโยชน์ที่ได้รับ
- Data Consistency: ข้อมูลมีความสอดคล้องและไม่ซ้ำซ้อน
- Data Integrity: ป้องกันข้อผิดพลาดจากการพิมพ์ผิด
- Multi-language Support: รองรับการแสดงผลภาษาไทยและอังกฤษ
- Easy Maintenance: แก้ไขข้อมูลได้จากที่เดียว
- Better Performance: ลดขนาดฐานข้อมูลและเพิ่มความเร็วในการค้นหา
- Standardization: สอดคล้องกับมาตรฐานของ Check List Master Data
- Integration Ready: พร้อมสำหรับการเชื่อมต่อกับระบบภายนอก
Compliance กับ TOR และ SRS
Schema ที่ปรับปรุงแล้วยังคงสอดคล้องกับ TOR และ SRS ของระบบเวชระเบียน:
- ✅ รองรับการลงทะเบียนผู้ป่วยใหม่ตาม TOR 1.2.1.1
- ✅ รองรับการส่งตรวจผู้ป่วยตาม TOR 1.2.1.2
- ✅ รองรับการจัดการแฟ้มเวชระเบียนตาม TOR 1.2.1.4
- ✅ รองรับการนัดหมายตาม TOR 1.2.1.5
- ✅ เพิ่มประสิทธิภาพในการค้นหาและรายงาน
- ✅ รองรับ Multi-language Interface
- ✅ เตรียมพร้อมสำหรับการ Integration กับระบบอื่น
เอกสารนี้จัดทำขึ้นเพื่อใช้ในการพัฒนาระบบเวชระเบียนสำหรับโรงพยาบาลค่ายธนรัชน์ และต้องได้รับการอนุมัติจากผู้มีอำนาจก่อนนำไปใช้ในการพัฒนาระบบ