W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
這個模塊為表示線段或者浮點區(qū)間實現(xiàn)了一種數(shù)據(jù)類型seg
。 seg
可以表示區(qū)間端點中的不確定性,這使得它對表達實驗室測量特別有用。
該模塊被認為是“trusted”,也就是說,它可以由對當前數(shù)據(jù)庫具有 CREATE
權(quán)限的非超級用戶安裝。
度量的幾何結(jié)構(gòu)通常比一個數(shù)字連續(xù)區(qū)中的一個點更復雜。 一個度量通常是具有一些模糊限制的連續(xù)區(qū)的一個分段。 由于不確定性和隨機性,也因為被度量的值可能天然地就是 一個指示某種情況的區(qū)間(例如一種蛋白質(zhì)的穩(wěn)態(tài)的溫度范圍), 度量呈現(xiàn)為區(qū)間的形式。
只用常識,我們就知道將這類數(shù)據(jù)存儲為區(qū)間比存儲為數(shù)字對更加方便。 實際上,這樣做在大部分應用中也更有效。
還是根據(jù)常識,限度的模糊性意味著使用傳統(tǒng)的數(shù)字數(shù)據(jù)類型會導致信息丟失。 試想:你的儀器讀到 6.50,并且你把這個讀數(shù)輸入到數(shù)據(jù)庫。在你取出它時會 得到什么?看看:
test=> select 6.50 :: float8 as "pH";
pH
---
6.5
(1 row)
在度量世界里,6.50 和 6.5 并不相同。有時候它們可能很不同。實驗者們通常會 寫下(并且發(fā)表)他們信任的數(shù)字。6.50 實際上是一個模糊的區(qū)間,它被包含于 一個更大的而且更模糊的區(qū)間 6.5 中,它們的中心點(可能)是它們唯一共享的 公共特征。我們絕對不希望這類不同的數(shù)據(jù)項表現(xiàn)得相同。
結(jié)論?一種能夠記錄具有任意可變精度的區(qū)間的限度的特殊數(shù)據(jù)類型是很好的。 這種意義下,每一個數(shù)據(jù)元素都記錄其自身的精度。
來看看這個:
test=> select '6.25 .. 6.50'::seg as "pH";
pH
------------
6.25 .. 6.50
(1 row)
一個區(qū)間的外部表達由通過范圍操作符(..
或者...
)連接的一個或者兩個浮點數(shù)構(gòu)成。 或者,它也可以被指定為一個中心點加上或者減去一個偏差值。 也能夠存儲可選的確定性指示符(<
、 >
或者~
)。不過,所有內(nèi)建操作符會忽略確定性指示符。
表 F.26給出了所有允許的表達形式,表 F.27展示了一些例子。
在表 F.26中,x
、y
和delta
表示浮點數(shù)。 x
和
y
可以前置一個確定性指示符,但是delta
不行。
表 F.26. seg
外部表達
|
單一值(零長度區(qū)間) |
|
從x 到y 的區(qū)間 |
|
從x - delta 到 x + delta 的區(qū)間 |
|
下界為x 的開區(qū)間 |
..
|
上界為x 的開區(qū)間 |
表 F.27. 合法seg
輸入的例子
5.0
|
創(chuàng)建一個零長度的段(一個點) |
~5.0
|
創(chuàng)建一個零長度的段并且在數(shù)據(jù)中記錄~ 。 ~ 會被seg 操作忽略,但是會被保留為一個注釋。 |
<5.0
|
在 5.0 創(chuàng)建一個點。< 會被忽略,但是被保留為一個注釋。 |
>5.0
|
在 5.0 創(chuàng)建一個點。> 會被忽略,但是被保留為一個注釋。 |
5(+-)0.3
|
創(chuàng)建一個區(qū)間4.7 .. 5.3 。注意(+-) 標記不會被保留。 |
50 ..
|
大于或等于 50 的所有東西 |
.. 0
|
小于或等于 0 的所有東西 |
1.5e-2 .. 2E-2
|
創(chuàng)建一個區(qū)間0.015 .. 0.02
|
1 ... 2
|
與1...2 、1 .. 2 或者1..2 相同 (范圍操作符周圍的空格會被忽略) |
由于...
運算符被廣泛地用在數(shù)據(jù)源中,它被允許作為..
運算符的一種替代。 不幸地是,這會帶來解析歧義:分不清0...23
的上界是23
或者0.23
。 通過要求seg
輸入中所有數(shù)字的小數(shù)點前至少有一位可以解決這個問題。
作為一種完整性檢查,seg
會拒絕下界大于上界的區(qū)間,例如5 .. 2
。
seg
值在內(nèi)部被存儲為一對 32 位浮點數(shù)。這意味著具有超過 7 個有效位的數(shù)字會被截斷。
具有 7 個或者更少有效位的數(shù)字會保留它們的原有精度。即,如果你的查詢返回 0.00, 你可以確信拖尾的零不是人工造成的,它們反映了原始數(shù)據(jù)的精度。前導零的數(shù)量不影響精度: 值 0.0067 被認為只有 2 個有效位。
seg
模塊包括了用于seg
值的一個 GiST 索引操作符類。 該 GiST 操作符類所支持的操作符在表 F.28中展示。
表 F.28. Seg GiST 操作符
操作符 簡述 |
---|
第一個 |
第一個 |
第一個 |
第一個 |
兩個 |
兩個 |
第一個 |
第一個 |
(在PostgreSQL 8.2之前,包含運算符@>
和<@
分別稱為@
和~
。這些名稱仍然可用,但已棄用,最終將被注銷。請注意,舊名稱與以前的約定相反,后跟核心幾何數(shù)據(jù)類型?。?/p>
除上述運算符外,表 9.1中顯示的常用比較運算符也可用于類型seg
。這些運算符首先比較(a)和(c),如果它們相等,則比較(b)和(d)。在大多數(shù)情況下,這會導致相當好的排序,如果您希望將ORDER BY用于此類型,這將非常有用。
使用的例子,請見回歸測試sql/seg.sql
。
將(+-)
轉(zhuǎn)換成常規(guī)范圍的機制在確定邊界的有效位數(shù)時并不完全準確。 例如,如果結(jié)果區(qū)間包括一個 10 的冪時,它會加上一個額外的位:
postgres=> select '10(+-)1'::seg as seg;
seg
---------
9.0 .. 11 -- should be: 9 .. 11
一個 R-樹索引的性能很大程度上依賴于輸入值的初始順序。 將輸入表以seg
列進行排序?qū)浅S袔椭?例子可見腳本sort-segments.pl
。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: