2018年12月23日 星期日

HL7 FHIR 資料型態篇 - Primitive Types

從前一章概念可知,真正最底層是Primitive Type。但他仍是Element,所以他會有Value這個屬性。而屬性的內容值該長什麼樣子,就是由Primitive Type來決定了。
==========
下圖是所有屬於Primitive Type的資料型態。(Element請參考概念)


從簡化的角度,資料型態說穿了,就只有數值、字串與時間。JSON所支援的資料型態就知可以很簡化,如:
  • string
  • number
  • object
  • array
  • boolean
  • null

數值類

  • boolean

這個好懂吧,就是bit,就是二元,不是真(true),就是假(false)。不像v3還有搞什麼空值有的沒有的。還有一點要注意,不能像C那樣,用1,0 來代表真假。
Regex: true|false

  • integer

整數,是數值類的一種,沒有小數點,這好懂吧。他的範圍是在−2,147,483,648..2,147,483,647(就是32bit)。如果超過此數值範圍者,使用decimal。
Regex: [0]|[-+]?[1-9][0-9]*
但從程式語言的角度,整數從所使用的位元數,以及正負號來說,其實還有多種型態。下列是C#的整數型別。

注意看,其實有分正數,或者有無帶符號之別。所以在HL7 FHIR中,整數之下,又多了兩個資料型態unsignedInt與positivenInt

  • unsignedInt

不帶正負號的32位元整數。實際上,少了一個位元攜帶正負號,所以他的數值範圍應該是從0到4,294,967,295。可是,FHIR文件中卻是0~2,147,483,647。
Regex: [0]|([1-9][0-9]*)

  • positiveInt

這個跟unsignedInt的差異,就在於有沒有一個0。範圍是從1~2,147,483,647。
Regex: +?[1-9][0-9]*

  • decimal

十進制,是數值類的一種,為實數型態,甚至說integer是衍生自他。
Regex: -?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?
就C#的角度,他是屬於浮點數型別,是有小數點的。這類包含有:

decimal是 128 位元的資料型別,適合財務和貨幣計算。在FHIR中所有浮點都是decimal,沒有float與double了。(XML有,JSON當然只有Numbers打死一切)


字串類

  • string

一系列Unicode字元之組合。
在程式語言中,這是常見之資料型態。但在FHIR中有幾點需注意:
  1. 長度不可以超過1MB。
  2. 不能使用Unicode前32個,除非是下列:
    • u0009 (horizontal tab)
    • u0010 (carriage return)
    • u0013 (line feed)
  3. 雖然字串前後可以加空白,但受限於XML忽視空白的機制,轉換成XML時,要遵守 removed when using the XML format (這個要到談Resource Format時)。
  4. 繞一圈,在FHIR中,字串應該是不包含空白的內容。
Regex: [ \r\n\t\S]+ 
明顯衍生自string的資料型態有:code, markdown與id。(有明顯,就有隱含)

  • id
可以是'A'~'Z', 'a'~'z', '0'~'9', '-', '.'。總長度限制在64個字元。

Regex: [A-Za-z0-9\-\.]{1,64}

  • code
其內容是字串,但被限定於某特定集合範圍中。這個內容前後不會有空白,或者只能有一個空白(就是在集合中找不到值)。

Regex: [^\s]+(\s[^\s]+)*
  • markdown


就是字串,只是這個字串內容包含了markdown的文法標記,可讓能處理markdow字串者,能展現排版後的內容。
Regex: \s*(\S|\s)*

以下就是隱含衍生自string的資料型態。

  • base64Binary

就是字串,是經過base64編碼過的字串。當然要遵循 RFC 4648 
Regex: (\s*([0-9a-zA-Z\+\=]){4}\s*)+ 

  • uri
他的英文全名為Uniform Resource Identifier Reference,其規範文件是RFC 3986。注意,這個是大小寫視為不同。
很多人對於URI, URL, URN搞的一頭霧水的人,又有研究精神的人,可以參考RFC 3305這份文件。(你真的很想看這樣子的文件,請服用這個http://www.rfcreader.com/)
我個人認知URI是一個父物件,提供一種基本定義。這個基本定義有個很重要的概念是命名空間(Namespace)。也就是說,不同的命名空間,也就形成了不同應用情境。其中若採用http:這樣的命名空間,我們給一個特定名稱叫URL。另外URN也是URI中的某一種命名空間,他的特定符號是urn:。指向一份擺在網路空間的文件(非網頁),可能就會用到urn:。希望能理解,無法理解也無所謂,除非你要成為標準制定者。

所以衍生自uri的資料型態有:url, canonical, uuid, oid。

  • url

有了uri的解說,應該可以接受下列說法。凡使用http{s}:、ftp:、mailto:與mllp:當命名空間所形成的uri都屬於url的資料型態。

  • canonical

許多資源會有自己的URL (但他不是網頁,這樣講也不對,是說這個網頁定義了這個資源)。一般而言,術語類(terminology)、一致性(conformance)或者知識資源(knowledge)都屬於這個資料型態。例如

<valueSet value="http://hl7.org/fhir/ValueSet/my-valueset"/>

這是說指定資料集(valueSet 也是一種FHIR Resource),來自http://hl7.org/fhir/ValueSet/my-valueset。

  • uuid (GUID) 
其規範文件是RFC 4122。形式為8-4-4-4-8。他屬於urn下的uuid命名空間。例如urn:uuid:c757873d-ec9a-4326-a141-556f43239520。
  • oid
其規範文件是RFC 3301。例如:urn:oid:1.2.3.4.5。
Regex: urn:oid:[0-2](\.(0|[1-9][0-9]*))+
為什麼oid的首字只能是0,1或2呢?那就只好來全世界OID註冊網站(http://www.oid-info.com)來瞧瞧。

懂了嗎?

時間類

屬於時間類的資料型態有四種,其實概念一樣,只是格式不同。

  • dateTime

這是基本型,包含了日期(date)與時間(time)。不過,他可以有簡化型,也就是可以只有年(year),或者年與月(year + month)。(為什麼沒有單獨月與日呢?那就變成數值資料型態了)
以下都是符合dateTime的格式:
    • YYYY
    • YYYY-MM
    • YYYY-MM-DD
    • YYYY-MM-DDThh:mm:ss+zz:zz (注意那個T固定值,非替代)
從程式語言的角度,會比這個更複雜,要注意。

  • date

有了dateTime之後,這個容易理解了吧。就是只包含日期的部分。以下都是符合date的格式:
    • YYYY
    • YYYY-MM
    • YYYY-MM-DD

  • time

代表某一天的時間點。但要注意,dateTime的時間部分,有包含時區。但是time沒有包含時區。符合格式一定是hh:mm:ss。

  • instant

這個翻譯成瞬間,就是那一剎哪。所以,他是dataTime,但不接受簡化型。他的格式一定要符合YYYY-MM-DDThh:mm:ss.sss+zz:zz。
==========
你想深入搞定HL7 FHIR,這些資料型態一定要搞懂。否則,你也只是嘴巴說會HL7 FHIR(台灣不缺這樣子的人)

沒有留言:

張貼留言