ช่วงหลายวันที่ผ่านมาผมพยายามหาคำตอบว่าควรออกแบบ data model ของระบบการสั่งยาทางอิเล็คทรอนิกส์อย่างไรดี ก็คือเวลาที่เราสั่งยา 1 รายการ ระบบควรเก็บข้อมูลอะไรบ้าง ในการนี้ก็พยายามหาข้อมูลจากแหล่งต่าง ๆ ครับ ซึ่งหนึ่งในแหล่งที่ผมว่าทำได้ดีมากก็คือ data model ของ FHIR เอง
ถ้าเราออกแบบโปรแกรมตามนี้ เราจะได้ประโยชน์ 2 ประการ
- สามารถแลกเปลี่ยนข้อมูลกับระบบอื่น ๆ ได้ เพื่อให้เกิด Health Information Exchange (HIE)
- Data model ของ FHIR ผ่านการคิดจากทีมผู้เชี่ยวชาญทั่วโลก การทำตามนี้เราน่าจะเก็บข้อมูลการสั่งยาได้ค่อนข้างสมบูรณ์ ครอบคลุมวิธีการสั่งยาของหมอส่วนใหญ่ ซึ่งทำให้เราได้ข้อมูลเป็น machine-readable ที่คอมพิวเตอร์สามารถประมวลผลต่อได้ และลดการใช้ free text (ซึ่งประมวลผลต่อยาก)
ในการที่เราจะเก็บข้อมูลการสั่งยาของผู้ป่วยได้สมบูรณ์ จำเป็นต้องใช้ FHIR resource ชื่อว่า MedicationRequest ซึ่งประกอบด้วย element ย่อย ๆ หลายชนิด ในบทความนี้ผมจึงขอโฟกัสแค่ที่ Dosage ก่อน
FHIR Data Type ชนิด Dosage
ในการศึกษาเรื่องนี้ ผมศึกษาจาก FHIR specification และ NHS Dose Syntax Implementation ของ NHS UK เป็นหลัก แม้ของ NHS จะใช้ FHIR STU3 มาเป็นฐานในการพัฒนา แต่ความเปลี่ยนแปลงใน data type ชนิด Dosage จาก STU3 มาเป็น R4 ก็ไม่ได้เยอะมาก (แค่เอา dose และ rate มาเป็น child ของ doseAndRate) แต่ถึงแม้เป็น FHIR R4 สำหรับ data type ชนิด Dosage นี้ก็ยังมี Maturity Level อยู่ที่ level 3 อยู่นะครับ เพราะฉะนั้นก็มีโอกาสเปลี่ยนแปลงได้อีกในอนาคตครับ
ข้อมูลที่เก็บไว้ใน FHIR มีดังนี้ครับ (ลิงค์) สังเกตว่าไม่มี element ไหนที่เป็น required เลย (ไม่มีอันไหนที่ Cardinality ขึ้นต้นด้วย 1) ดังนั้นเราสามารถเลือกหยิบมาใช้ให้ตอบโจทย์ของเราได้

อธิบายแต่ละ element
1. sequence
เอาไว้ระบุลำดับของ order นั้น แบ่งเป็น 2 แบบคือ sequential และ concurrent
- Sequential: ใช้ในกรณี เช่น Prednisolone 60mg daily for 4 days, then 50mg next day, then 40mg, then 30mg, then 20mg, then 10mg, then stop แบบนี้ sequence จะเป็น 1 (60mg), 2 (50mg), 3(40mg), 4(30mg) ไปเรื่อย ๆ
- Concurrent: ใช้ในกรณี เช่น Furosemide 40mg tablets, take two in the morning and one at midday for one week แบบนี้ sequence ก็จะเป็น 1 (2 เม็ดเช้า) และ 1 (1 เม็ดเที่ยง) ทั้งคู่ เพราะเกิดขึ้นพร้อมกัน
2. text
ใช้ในกรณี 1) ไว้แสดงข้อมูลกับผู้อ่านที่เป็นมนุษย์ เช่น คนไข้ หรือคนจะบริหารยา หรือ 2) กรณีที่ instruction นั้นซับซ้อนเกินกว่าที่จะลงแบบ structured data ได้ ซึ่งการใช้แบบนี้มีโอกาสใช้น้อย
3. additionalInstruction
ใช้อธิบายวิธีใช้เพิ่มเติมสำหรับคนไข้ (เช่น กินพร้อมอาหาร, กิน 0.5 ถึง 1 ชม.ก่อนอาหาร) หรือใช้บันทึกคำเตือน (เช่น อาจทำให้ง่วง) อันนี้ใน FHIR เลือกจาก value set ชื่อ SNOMED CT Additional Dosage Instructions ซึ่งมีอยู่ 40 concepts
4. patientInstruction
ใช้อธิบายวิธีใช้เพิ่มเติมด้วยคำศัพท์ที่คนไข้สามารถเข้าใจได้
5. timing
อันนี้เป็น complex data type อีกประเภทซึ่งชื่อว่า Timing ซึ่งประกอบด้วย element ดังนี้

timing เป็น element ที่เอาไว้ระบุว่ายาที่สั่งนั้นใช้ในเวลาใดบ้าง ความซับซ้อนจะอยู่ใน element ชื่อ repeat ซึ่งเอาไว้ระบุว่ายามีการใช้ซ้ำอย่างไรบ้าง โดยมีรายละเอียดที่สำคัญ ๆ คือ
5.1 frequency และ period
frequency ใช้ระบุจำนวนครั้ง ส่วน period ใช้ระบุช่วงเวลา ดังนั้นหากเราจะกำหนด 4 ครั้งต่อวัน ก็จะเป็น
{ "frequency":4, "period":1, "periodUnit":"d" }
- UnitsOfTime ของ period ต้องกำหนดตาม UCUM ซึ่งมี 7 ค่า คือ s, min, h, d, wk, mo, a
- frequencyMax ใช้กำหนดจำนวนครั้งต่อ period สูงสุด เช่น 2-4 ครั้งต่อวัน ก็จะเป็น
{ "frequency":2, "frequencyMax":4, "period":1, "periodUnit":"d" }
- periodMax ใช้กำหนดระยะเวลาสูงสุด เช่น ทุก 3-4 สัปดาห์ ก็จะเป็น
{ "period":3, "periodMax":4, "periodUnit":"wk" }
5.2 when และ offset
when ใช้ระบุเวลาที่ต้องการให้ใช้ยา ณ จุดใดจุดหนึ่งของวัน ประกอบด้วย 26 concepts เช่น MORN (เช้า), MORN.early (early morning), CM (ตอนกินข้าวเช้า), PC (หลังอาหาร), PCM (หลังอาหารเช้า), HS (ก่อนนอน)
offset ใช้ระบุระยะเวลาก่อนเหตุการณ์ใน when มีหน่วยเป็นนาที เมื่อใช้ร่วมกันก็จะยกตัวอย่างเช่น 1 ชม.ก่อนอาหารเช้า
{"when":"ACM", "offset":60}
5.3 daysOfWeek, timeOfDay
ใช้ระบุวันหรือเวลา มักใช้ร่วมกับ frequency และ period ให้วันละ 2 ครั้งเวลา 10:00 และ 14:00 ก็จะเป็น (ผมไม่แน่ใจว่าที่ถูกแล้ว timeOfDay หากใส่แบบ one-to-many จะใช้ array แบบนี้หรือเปล่านะครับ แต่หลักการคือแบบนี้แหละครับ)
{ "frequency":2, "period":1, "periodUnit":"d", "timeOfDay":[ "10:00:00", "14:00:00"] }
หรือ ให้ทุกวันจันทร์ตอนเที่ยง ก็จะเป็น
{ "frequency":1, "period":1, "periodUnit":"wk", "dayOfWeek":"mon", "timeOfDay":"12:00:00" }
5.4 duration, bounds, count
duration และ durationMax: ระยะเวลาที่ให้ยา และระยะเวลาสูงสุด ใช้กับการให้ยาตัวเดียวครั้งเดียว มักใช้กับพวก infusion หรือยาแปะผิวหนัง เช่น ให้เป็นระยะเวลา 8 ชม. แต่ไม่เกิน 16 ชม. ก็จะเป็น
{ "duration":8, "durationMax":16, "durationUnit":"h" }
bounds[x]: ระยะเวลาที่ให้ยาเช่นกัน แต่หมายถึงการให้ยาตัวเดียวหลาย ๆ ครั้ง (ให้เป็นคอร์ส) ซึ่งสามารถเลือกระบุค่าได้ 3 วิธี
- boundsDuration: ระยะเวลา เช่น กินยา A วันละ 3 ครั้ง เป็นระยะเวลา 7 วัน
- boundsRange: ระยะเวลาแบบเป็นช่วง เช่น ให้ไป 2-3 สัปดาห์
- boundsPeriod: ระยะเวลาแบบระบุวันเวลา เช่น ให้ตั้งแต่ 1 มิ.ย. ถึง 16 มิ.ย.
count: นับเป็นจำนวนครั้ง เช่น ให้ทั้งหมด 3 ครั้ง ถ้าจะกำหนดเป็นช่วง เช่น 3-4 ครั้ง ก็ให้ใช้ countMax มากำหนดค่าหลัง
5.5 event
จริง ๆ ตั้งแต่ 5.1-5.4 เป็นการใช้ยาแบบ repeat คือยาที่ให้หลายครั้งในหลายเวลา แต่ถ้าเราอยากระบุวันและเวลาแบบเฉพาะเจาะจงเลย เช่น ให้วันที่ 16 มิ.ย. 2020 ตอน 17:00 น. ก็จะเป็น
{ "event":"2020-06-16T17:00"}
6. asNeeded[x]
ก็คือการสั่งยาแบบ PRN สามารถเลือกระบุค่าได้ 2 แบบคือ asNeededBoolean และ asNeededCodeableConcept
asNeededBoolean: ระบุค่าแบบเป็น true/false เช่น กินก่อนนอน PRN ก็จะเป็น
{ "timing":{ "repeat":{ "frequency":1, "period":1, "periodUnit":"d", "when":"HS" }, "asNeededBoolean":"true" } }
asNeededCodeableConcept: ใช้ในกรณีต้องการระบุ condition ที่จะให้ใช้ยา โดยอิงจาก terminology จากในตัวอย่างของ FHIR ใช้ SNOMED-CT โดยให้เลือกค่าใดก็ได้ที่เป็น child ของ Clinical Finding (ลิงค์ของ NHS UK จึงเป็น SNOMED-CT UK edition) เช่น กินเมื่อคลื่นไส้ ก็จะเป็น
{ "asNeededCodeableConcept":{ "coding":{ "system":"http://snomed.info/sct", "code":"422587007", "display":"nausea" } } }
7. site
ใช้ระบุตำแหน่งของร่างกายที่จะให้ยา ในตัวอย่างของ NHS ใช้ค่าใดก็ได้ที่เป็น child ของ Body Structure ซึ่งมี children เยอะมาก
8. route
ใช้ระบุเส้นทางในการบริหารยา ในตัวอย่างของ NHS ใช้ค่าใดก็ได้ที่เป็น child ของ Route of administration value (qualifier value) ซึ่งประกอบด้วย 70 concepts ซึ่งมีทุกทางที่เป็นไปได้แล้วที่เราจะให้ยากับคน ตั้งแต่อันที่นิยมหน่อย เช่น intravenous, subdermal, oral ไปจนถึงอันที่แปลก ๆ เช่น intramammary, intratesticular, intratendinous
9. method
ใช้ระบุวิธีการให้ยา ของ NHS ใช้ refset ของ SNOMED-CT UK edition ชื่อ ePrescribing reference set มีสมาชิก 83 concepts แต่ใน FHIR หลักมี value set ซึ่งดึงมาจาก SNOMED-CT เช่นกัน มีสมาชิก 58 concepts ตัวอย่าง method เช่น Injection, Swallow, Chew, Shampoo ฯลฯ
10. doseAndRate
ใช้ระบุปริมาณของยาที่ใช้
10.1 type
ใช้ระบุว่าข้อมูลนี้มาจากการสั่งโดยมนุษย์โดยตรง (ordered) หรือมาจากการคำนวณของคอมพิวเตอร์ (calculated)
10.2 dose[x]
ใช้ระบุโดสของยา ซึ่งเราสามารถเลือกระบุข้อมูลได้ 2 วิธี
10.2.1 doseRange
ใช้ระบุค่าเป็นช่วง เช่น ให้ได้ระหว่าง 7.5-30 mg ก็จะเป็น
{ "doseRange":{ "low":{ "value":7.5, "unit":"milligram", "code":"mg", "system":"http://unitsofmeasure.org" }, "high":{ "value":30, "unit":"milligram", "code":"mg", "system":"http://unitsofmeasure.org" } } }
10.2.2 doseQuantity
ใช้ระบุค่าเป็นค่าเดียว เช่น 1 capsule, 30 milligram โดยหน่วยนับแล้วแต่เรากำหนด ของ NHS prefer ให้ใช้ UCUM มากกว่า (กรัม, มิลลิลิตร, ฯลฯ) แต่ก็อนุญาตให้ใช้ SNOMED-CT ได้เช่นกัน (tablet, capsule, ampule)
10.3 rate[x]
ใช้ระบุปริมาณยาต่อหน่วยเวลา
10.3.1 rateRatio
ระบุ rate แบบมีตัวตั้ง (numerator) และตัวหาร (denominator) เช่น ให้ 30 ml/hour ก็จะเป็น
{ "rateRatio":{ "numerator":{ "value":30, "unit":"millilitre", "system":"http://unitsofmeasure.org", "code":"mL" }, "denominator":{ "value":1, "unit":"hour", "system":"http://unitsofmeasure.org", "code":"h" } } }
10.3.2 rateRange
ระบุ rate แบบเป็นช่วง เช่น 1-2 litres per minute ก็จะเป็น
{ "rateRange":{ "low":{ "value":1, "unit":"liter per minute", "system":"http://unitsofmeasure.org", "code":"L/min" }, "high":{ "value":2, "unit":"liter per minute", "system":"http://unitsofmeasure.org", "code":"L/min" } } }
10.3.3 rateQuantity
ระบุ rate แบบเป็นปริมาณ เช่น 30ml/hour ด้านบน จริง ๆ สามารถเขียนได้อีกวิธี
{ "rateQuantity":{ "value":30, "unit":"milliliters per hour", "system":"http://unitsofmeasure.org", "code":"mL/h" } }
11. maxDosePerPeriod
ปริมาณสูงสุดที่ให้ได้ต่อระยะเวลา เช่น ให้ซ้ำได้ทุกชม. แต่ไม่เกิน 24 ชม.
12. maxDosePerAdministration
ปริมาณสูงสุดที่ให้ได้ต่อ 1 ครั้ง แต่ NHS บอกว่าในการใช้งานส่วนใหญ่เรามักจะไปใช้ doseRange มากกว่าใช้อันนี้
13. maxDosePerLifetime
ปริมาณสูงสุดที่ให้ได้ในชีวิต
ลองทำ User Interface (UI) จากข้อมูลด้านบน
ทีนี้สมมติว่าเราข้ามประเด็นเรื่องวิธีการเลือกชนิดยา (ไม่ว่าจะ generic, trade, หรือเลือกจาก substance ก็ตาม) ผมคิดว่าประเด็นพิจารณาในการออกแบบ UI ซึ่งทางรพ.ต้องสรุปนโยบายของตนให้ได้ก่อน มีดังนี้
- จะอนุญาตให้มีการสั่งด้วยค่าเป็น range หรือไม่ เช่น จะให้สั่งด้วยคำสั่งประเภท 1-2 tabs, 3-4 weeks, up to 8 hours
- หากไม่อนุญาต ก็จะไม่จำเป็นต้องใช้พวก periodMax, frequencyMax, durationMax, doseRange, rateRange
- หากอนุญาตให้ใช้ ผมว่าง่ายสุดน่าจะอนุญาตให้พิมพ์ 1-2 ไปในตัวเลขได้ แต่ระบบต้องแปลงพวกนี้เป็น structure data ได้ และความยากจะอยู่กรณีหน่วยนับไม่เท่ากัน เช่น อันนึงวัน อีกอันสัปดาห์
- ส่วนตัวคิดว่าไม่อนุญาตไปเลยง่ายกว่า ทำให้คำสั่งชัดเจนขึ้น และก็ง่ายในการจัดการ stock
- จะอนุญาตให้ระบุเวลาได้กี่แบบ ซึ่งใน FHIR เอง จริง ๆ ก็มีหลัก ๆ 3 แบบ (ใช้ผสมกันได้)
- ความถี่ เช่น 3 ครั้งต่อวัน โดยใช้ frequency และ period
- กำหนดจากเหตุการณ์ในวัน เช่น ก่อนอาหาร โดยใช้ when และ offset
- กำหนดเป็นเวลาที่ชัดเจนไปเลย โดยใช้ daysOfWeek, timeOfDay, boundsDuration, boundsPeriod
- ข้อมูลหลายอย่าง อาจต้องตั้งค่ามาตั้งแต่ master data ของยา ได้แก่ method และ route ส่วน site ก็อาจจะไม่ค่อยจำเป็นใน use case ส่วนใหญ่
- method – เช่น ถ้ายากินยังไงก็ Swallow หรือ Chew ซึ่งยาไหนที่ต้องเคี้ยวเราก็มักรู้อยู่แล้ว
- route – ยาแต่ละตัวก็มักมี route ที่ให้ได้ไม่กี่แบบ เช่น ยาฉีดทั่ว ๆ ไปก็คง intravenous
- site – อันนี้น่าจะได้ใช้แค่ในพวกยาฉีด ยาทาเฉพาะที่ ซึ่งก็ให้ขึ้นมาเฉพาะตอนเลือกยาที่ต้องระบุ body site จริง ๆ ก็ได้
- เรื่อง dose อันนี้สัมพันธ์กับการเลือกชนิดของยา บางที่เลือกเป็น dose-base บางที่เลือกเป็น product-base แต่คิดว่าเมืองไทยน่าจะ product-base เป็นหลัก ส่วนตัวผมว่าก็ให้เลือกว่าจะระบุเป็น dose หรือเป็น rate ถ้าเป็น rate ก็ใช้ rateQuantity อย่างเดียวไปเลย
- กำหนดลิสท์ของสิ่งที่จะไว้ใน additionalInstruction แต่ให้ user พิมพ์ text เองได้ กรณีไม่อยู่ในลิสท์ที่เตรียมไว้ก็เอาไปใส่ไว้ที่อื่น
จากทั้งหมดข้างต้น น่าจะออกมาราว ๆ นี้ (ขอเน้นข้อมูลครบ ไม่เน้นความสวยงามหรือใช้ง่ายอะไรนะครับ 😆) ในตัวอย่างที่ 1 ด้านล่างนี้น่าจะเป็น most common case ของการสั่งยาเม็ด

ตัวอย่างที่ 2 หากอยากเลือกเป็นเวลา แทนเหตุการณ์ในวันนั้น ๆ

ตัวอย่างที่ 3 หากกำหนดวิธีการเลือก timing แบบอื่น ๆ

ตัวอย่างที่ 4 หากอยากกำหนด timing แบบ specific มาก ๆ เช่น กินทุกข้างขึ้นข้างแรม

ตัวอย่างที่ 5 ยาบางชนิดอาจเหมาะกับการเลือกเป็น rate มากกว่าเป็น dose เช่น ยาฉีดทั้งหลาย

ตัวอย่างที่ 6: กรณีการสั่งยามีหลาย sequence

ผมคิดว่าถ้าเราเก็บข้อมูลได้ครบ เรื่องไปหาวิธีให้ใช้ง่ายมันมีทางของมันอยู่ครับ (แต่การใช้ง่ายมักแลกมาด้วยการ dev ยาก 😆) ท่านใดสนใจลองนำไปออกแบบเพิ่มเติมดูครับ
และที่เอามาแสดงนี้ อันนี้แค่เลือก dose นะครับ ยังไม่ได้เลือกยาเลย 55
เดี๋ยวไว้มีโอกาสผมมาเขียนเรื่องเลือกยาต่อครับ