F.34. seg
该模块实现了用于表示线段或浮点间隔的数据类型seg
。 seg
可以表示时间间隔端点中的不确定性,这对于表示实验室测量值特别有用。
F.34.1. Rationale
测量的几何形状通常比数字连续体中的点的几何形状复杂。度量通常是该连续体的一部分,其界限有些模糊。由于不确定性和随机性,以及因为所测量的值自然可以是指示某些条件(例如蛋白质稳定性温度范围)的间隔,因此测量结果以间隔的形式出现。
仅使用常识,将这些数据存储为间隔而不是成对的数字似乎更为方便。实际上,它在大多数应用中甚至更有效率。
进一步沿着常识来看,限制的模糊性表明使用传统的数字数据类型会导致一定程度的信息丢失。考虑一下:您的仪器读数为 6.50,并将此读数 Importing 数据库。取回时会得到什么?看:
test=> select 6.50 :: float8 as "pH";
pH
---
6.5
(1 row)
在度量世界中,6.50 与 6.5 不同。有时可能会截然不同。实验人员通常记下(并发布)他们信任的数字。 6.50 实际上是包含在更大甚至更模糊的区间 6.5 中的模糊区间,其中心点(可能)是它们共享的唯一共同 Feature。我们绝对不希望这些不同的数据项显示相同。
结论?最好有一个特殊的数据类型,它可以以任意可变的精度记录间隔的限制。从每个数据元素记录其自身精度的意义上讲,它是可变的。
看一下这个:
test=> select '6.25 .. 6.50'::seg as "pH";
pH
------------
6.25 .. 6.50
(1 row)
F.34.2. Syntax
区间的外部表示是使用一个或两个浮点数形成的,这些浮点数由范围运算符(..
或...
)连接。或者,可以将其指定为中心点加上或减去偏差。也可以存储可选的确定性指示符(<
,>
或~
)。 (但是,所有内置运算符都忽略了确定性 Metrics.)Table F.26概述了允许的表示形式; Table F.27显示了一些示例。
在Table F.26中,* x
, y
和 delta
*表示浮点数。 * x
和 y
(但不是 delta
*)之前可以带有确定性指示符。
表 F.26.seg
外部代表
x | 单值(零长度间隔) |
x .. y | 从* x 到 y *的时间间隔 |
x (+-) delta | 从* x - delta 到 x * * delta *的时间间隔 |
x .. | 下限为开区间* x * |
.. x | 开区间上限* x * |
表 F.27.有效的seg
Importing 示例
5.0 | 创建一个零长度的线段(如果需要,则指向一个点) |
~5.0 | 创建一个长度为零的段,并将~ 记录在数据中。 ~ 被seg 操作忽略,但保留为 Comments。 |
<5.0 | 在 5.0 创建一个点。 < 被忽略,但保留为 Comments。 |
>5.0 | 在 5.0 创建一个点。 > 被忽略,但保留为 Comments。 |
5(+-)0.3 | 创建间隔4.7 .. 5.3 。请注意,不会保留(+-) 表示法。 |
50 .. | 大于或等于 50 的所有内容 |
.. 0 | 小于或等于 0 的所有内容 |
1.5e-2 .. 2E-2 | 创建间隔0.015 .. 0.02 |
1 ... 2 | 与1...2 或1 .. 2 或1..2 相同(范围运算符周围的空格将被忽略) |
由于...
在数据源中广泛使用,因此可以将..
用作替代拼写。不幸的是,这会造成解析模糊性:尚不清楚0...23
的上限是23
还是0.23
。通过在seg
Importing 中的所有数字中要求小数点前至少一位数字来解决此问题。
作为健全性检查,seg
拒绝下限大于上限的间隔,例如5 .. 2
。
F.34.3. Precision
seg
值在内部存储为 32 位浮点数对。这意味着有效位数超过 7 位的数字将被截断。
有效数字少于或等于 7 的数字保留其原始精度。也就是说,如果您的查询返回 0.00,则将确保尾随零不是格式化的伪像:它们反映原始数据的精度。前导零的数目不影响精度:值 0.0067 被认为只有 2 个有效数字。
F.34.4. Usage
seg
模块包含用于seg
值的 GiST 索引运算符类。 GiST 运算符类支持的运算符显示在Table F.28中。
表 F.28.Seg GiST 运算符
Operator | Description |
---|---|
[a, b] << [c, d] | [a,b]完全位于[c,d]的左侧。也就是说,如果 b <c,则[a,b] << [c,d]为 true,否则为 false。 |
[a, b] >> [c, d] | [a,b]完全在[c,d]的右侧。也就是说,如果 a> d,则[a,b] >> [c,d]为 true,否则为 false。 |
[a, b] &< [c, d] | 重叠或在其左侧-最好将其理解为“不延伸至其右侧”。当 b <= d 时为真。 |
[a, b] &> [c, d] | 重叠或在其右边-最好将其理解为“不延伸到其左边”。当 a> = c 时是正确的。 |
[a, b] = [c, d] | 与—相同–段[a,b]和[c,d]相同,即 a = c 和 b = d。 |
[a, b] && [c, d] | 段[a,b]和[c,d]重叠。 |
[a, b] @> [c, d] | 段[a,b]包含段[c,d],即 a<= c and b > = d。 |
[a, b] <@ [c, d] | 段[a,b]包含在[c,d]中,即 a> = c 和 b <= d。 |
(在 PostgreSQL 8.2 之前,容器运算符@>
和<@
分别称为@
和~
.这些名称仍然可用,但已过时,最终将被淘汰.请注意,旧名称与惯例相反,以前是约定,之后是核心几何数据类型!)
还提供了标准的 B 树运算符,例如
Operator | Description |
---|---|
[a, b] < [c, d] | Less than |
[a, b] > [c, d] | Greater than |
这些操作符除了排序之外,对于任何实际目的都没有多大意义。这些运算符首先将(a)与(c)相比较,如果相等,则将(b)与(d)相比较。在大多数情况下,这会导致合理的排序,如果要将此类型与 ORDER BY 一起使用,则很有用。
F.34.5. Notes
有关用法的示例,请参见回归测试sql/seg.sql
。
将(+-)
转换为常规范围的机制在确定边界的有效位数方面并不完全准确。例如,如果结果间隔包括十的幂,它将在下边界添加一个额外的数字:
postgres=> select '10(+-)1'::seg as seg;
seg
---------
9.0 .. 11 -- should be: 9 .. 11
R 树索引的性能在很大程度上取决于 Importing 值的初始 Sequences。在seg
列上对 Importing 表进行排序可能非常有帮助;有关示例,请参见脚本sort-segments.pl
。
F.34.6. Credits
原作者:吉恩·塞尔科夫(Gene Selkov,Jr. <[email protected]>
),阿贡国家实验室 math 和计算机科学系。
我主要感谢 Joe Hellerstein 教授(http://db.cs.berkeley.edu/jmh/)阐明了 GiST(http://gist.cs.berkeley.edu/)的要旨。我也感谢所有 Postgres 开发人员,无论现在还是过去,使我能够创建自己的世界并在其中不受干扰地生活。我还要感谢 Argonne 实验室和美国能源部多年来对数据库研究的忠实支持。