2018年12月22日 星期六

HL7 FHIR 資料型態篇 - 概念

資料型態對資料科學(趕流行)來說是重要基礎。對資料交換標準來說,更是重要基石。
若熟悉HL7 v2.X或者 v3相關標準,那對於HL7 FHIR的資料型態就可以輕鬆入門了。
如果你想成為HL7 FHIR無論前端或後端的開發者,資料型態物必要研究清楚。
(補充說明:本篇講的資料型態是R4版本)
==========
HL7 FHIR的資料型態可分成四大類型:
  1. Primitive Types
  2. General Purpose Data types
  3. Special Purpose Data types
  4. Metadata Types
有幾點要說明。
  1. R3的資料型態分成:Primitive Types與Complex Types
  2. 就程式語言的角度,資料型態可分成:
    • C#命名法:Value types與Reference types。
    • Java命名法:Primary types與Refernce types。
  3. 程式語言角度的Primary或者Value types。其機制是可以直接放值,值的內容就是尤其資料型態所決定。但實際上只有三大類型。
    • 數值類
    • 字串類
    • 日期類
  4. 程式語言角度的Reference Types,其實就是把變數宣告成某個類別。
  5. 但是...HL7 FHIR所有的資料型態都是類別,都是繼承於Element。
接著就來看看,HL7 FHIR所有資料型態。




看到一個重點了嗎?
Element
所以,先來搞定這傢伙。
所有的資源都是由一堆Element所組成,每一個Element都會定義為一種資料型態,或者是一組資料結構。這樣子有聽沒有懂。要從XML角度切入。
借用別人的圖:
「XML element」的圖片搜尋結果
Student是一個element,他有sub-element。
講到者,就得提一下HL7 FHIR與HL7 V3的最大不同點。
HL7 v3的物件結構中,我們要分辨,誰是sub-element誰是attribute。沒經驗,可能就為放錯。除非使用程式庫。
但在HL7 FHIR中,就算是Data type他也是element。所以,剛剛四大類型的資料型態,都是繼承於Element。硬分成Primitive或Complex,也只不過是說裡面的Element是一條,還是很多條,或者還有sub-element。
=========
Element是屬於Foundation這個Module。但是,去Foundation Module的首頁,看不到Element的相關連接。
只能從DataType頁面中取得,或者是到Documentation Index的頁面,在Base Type的區塊中取得連結。
來看看Element的資料結構(這邊就不能說是資料型態,能理解嗎?)。
原來,所有的element都可以有id與extension這兩個sub-element。而資料型態分別為string(primitive),Extension(Special)。[別被這種你中有我,我中有你的結構給打敗了]
其實,這兩個Element其實不重要。重要的是,那個限制條件。
他規定說,所有的Element都必須要有一個Value的屬性,否則的話,他就必須要有sub-element。
所以,在HL7 FHIR中的任何一個element(包含資料型態),他的XML呈現結構都可以是:(抱歉,此時id被展現在屬性)
<use id="[internal id]">
    <extension url="..."/>
      ... if there are any extensions
    <extension>
    .. elements of Coding type...
  </use>
JSON的話(看吧!這就不會受到是不是放在屬性之干擾)
{
    "use" : {
      "id" : "[internal id]",
      "extension" : [
        ..extensions, if present...
      ],
      .. properties of Coding type...
    }
  }
我們用Patient這個Resource來說明吧。下圖是Patient的部分結構。

他繼承DomainResource,所以,有些欄位在這邊看不到。(這部份在講Resource篇的時候會提到)
就看identifier與active。先看active。他的資料型態是boolean(Primitive),根據文件,他的值只能有true或者false。
但是,他還是繼承於element呀。element告訴我們,他是Primitive,沒有sub-element,他就得要有@value的屬性。
來看看Patient所提供的範例:
<active value="true"/> 
這樣子看懂了嗎?(如果他要多加一個id屬性也是可以的。想想HTML的id,喔!是一樣的。)
再看identifier。他的資料型態是Identifier(General Purpose),他會有自己的資料結構。

是的,就這樣子一層一層展開,一直碰到Primitive的Element時才會停止展開。來看範例。
<identifier> 
    <use value="usual"/> 
    <type> 
      <coding> 
        <system value="http://hl7.org/fhir/v2/0203"/> 
        <code value="MR"/> 
      </coding> 
    </type> 
    <system value="urn:oid:1.2.36.146.595.217.0.1"/> 
    <value value="12345"/> 
    <period> 
      <start value="2001-05-06"/> 
    </period> 
    <assigner> 
      <display value="Acme Healthcare"/> 
    </assigner> 
  </identifier> 
現在,看到這個範例應該舒服多了吧。
若要全部看懂,就得把所有的Primitive Type全部看過一遍,就更清楚了。

沒有留言:

張貼留言