PostgreSQL seg

2021-09-16 17:18 更新
F.34.1. 原理
F.34.2. 語法
F.34.3. 精度
F.34.4. 用法
F.34.5. 注解

這個模塊為表示線段或者浮點區(qū)間實現(xiàn)了一種數(shù)據(jù)類型seg。 seg可以表示區(qū)間端點中的不確定性,這使得它對表達實驗室測量特別有用。

該模塊被認為是trusted,也就是說,它可以由對當前數(shù)據(jù)庫具有 CREATE 權(quán)限的非超級用戶安裝。

F.34.1. 原理

度量的幾何結(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)

F.34.2. 語法

一個區(qū)間的外部表達由通過范圍操作符(..或者...)連接的一個或者兩個浮點數(shù)構(gòu)成。 或者,它也可以被指定為一個中心點加上或者減去一個偏差值。 也能夠存儲可選的確定性指示符(<、 >或者~)。不過,所有內(nèi)建操作符會忽略確定性指示符。 表 F.26給出了所有允許的表達形式,表 F.27展示了一些例子。

在表 F.26中,x、ydelta表示浮點數(shù)。 xy 可以前置一個確定性指示符,但是delta不行。

表 F.26. seg外部表達

x 單一值(零長度區(qū)間)
x .. y xy的區(qū)間
x (+-) delta x - deltax + delta的區(qū)間
x .. 下界為x的開區(qū)間
.. x 上界為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。

F.34.3. 精度

seg值在內(nèi)部被存儲為一對 32 位浮點數(shù)。這意味著具有超過 7 個有效位的數(shù)字會被截斷。

具有 7 個或者更少有效位的數(shù)字會保留它們的原有精度。即,如果你的查詢返回 0.00, 你可以確信拖尾的零不是人工造成的,它們反映了原始數(shù)據(jù)的精度。前導零的數(shù)量不影響精度: 值 0.0067 被認為只有 2 個有效位。

F.34.4. 用法

seg模塊包括了用于seg值的一個 GiST 索引操作符類。 該 GiST 操作符類所支持的操作符在表 F.28中展示。

表 F.28. Seg GiST 操作符

操作符

簡述

seg << seg布爾值

第一個seg是否完全位于第二個的左側(cè)? [a, b] << [c, d] is true if b < c.

seg >> seg布爾值

第一個seg是否完全位于第二個的右側(cè)? [a, b] >> [c, d] is true if a > d.

seg &< seg布爾值

第一個seg沒有延伸到第二個的右邊嗎? [a, b] &< [c, d] is true if b <= d.

seg &> seg布爾值

第一個seg沒有延伸到第二個的左邊嗎? [a, b] &> [c, d] is true if a >= c.

seg = seg布爾值

兩個seg是否相等?

seg && seg布爾值

兩個seg是否重疊?

seg @> seg布爾值

第一個seg是否包含第二個?

seg <@ seg布爾值

第一個seg是否被第二個包含?


(在PostgreSQL 8.2之前,包含運算符@><@分別稱為@~。這些名稱仍然可用,但已棄用,最終將被注銷。請注意,舊名稱與以前的約定相反,后跟核心幾何數(shù)據(jù)類型?。?/p>

除上述運算符外,表 9.1中顯示的常用比較運算符也可用于類型seg。這些運算符首先比較(a)和(c),如果它們相等,則比較(b)和(d)。在大多數(shù)情況下,這會導致相當好的排序,如果您希望將ORDER BY用于此類型,這將非常有用。

F.34.5. 注解

使用的例子,請見回歸測試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。

 


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號