F.11. cube — 多维立方体数据类型#
此模块实现了一个数据类型cube
,用于表示多维立方体。
此模块被认为是“受信任的”,也就是说,它可以由在当前数据库上具有CREATE
权限的非超级用户安装。
F.11.1. 语法#
表 F.2显示了cube
类型的有效外部表示。x
、*y
*等表示浮点数。
表 F.2. 立方体外部表示
外部语法 | 含义 |
---|---|
| 一维点(或零长度一维区间) |
( | 与上述相同 |
| n 维空间中的一个点,在内部表示为零体积立方体 |
( | 与上述相同 |
( | 一维区间,从 x 开始,在 y 结束,或反之亦然;顺序无关紧要 |
[( | 与上述相同 |
( | 由一对对角线相对的角表示的 n 维立方体 |
[( | 与上述相同 |
以何种顺序输入立方体的相对角并不重要。cube
函数会根据需要自动交换值,以创建统一的“左下角 — 右上角”内部表示。当角重合时,cube
仅存储一个角以及一个“是点”标志,以避免浪费空间。
输入时会忽略空格,因此[(*
x*),(*
y*)]
与[ (*
x*), (*
y*) ]
相同。
F.11.2. 精度#
值在内部存储为 64 位浮点数。这意味着,超过约 16 个有效数字的数字将被截断。
F.11.3. 用法#
表 F.3显示了为类型cube
提供的专门运算符。
表 F.3. Cube 运算符
运算符 描述 |
---|
Cube 是否重叠? |
第一个 Cube 是否包含第二个 Cube? |
第一个 Cube 是否包含在第二个 Cube 中? |
提取 Cube 的第 |
提取 Cube 的第 |
计算两个 Cube 之间的欧几里得距离。 |
计算两个 Cube 之间的出租车(L-1 度量)距离。 |
计算两个 Cube 之间的切比雪夫(L-inf 度量)距离。 |
除了上述运算符外,表 9.1中所示的常见比较运算符也可用于类型cube
。这些运算符首先比较第一个坐标,如果相等,则比较第二个坐标,依此类推。它们主要用于支持cube
的 b 树索引运算符类,例如,如果您希望对cube
列进行 UNIQUE 约束,这可能很有用。否则,此排序在实践中并没有多大用处。
cube
模块还为cube
值提供了一个 GiST 索引运算符类。cube
GiST 索引可用于在WHERE
子句中使用运算符=
、&&
、@>
和<@
搜索值。
此外,cube
GiST 索引可用于在ORDER BY
子句中使用度量运算符<->
、<#>
和<=>
查找最近邻域。例如,可以使用以下方法有效地找到 3-D 点 (0.5, 0.5, 0.5) 的最近邻域
SELECT c FROM test ORDER BY c <-> cube(array[0.5,0.5,0.5]) LIMIT 1;
~>
运算符也可以这样使用,以有效地按选定的坐标检索排好序的前几个值。例如,要按第一个坐标(左下角)升序排列前几个立方体,可以使用以下查询
SELECT c FROM test ORDER BY c ~> 1 LIMIT 5;
要按右上角的第一个坐标降序排列 2-D 立方体
SELECT c FROM test ORDER BY c ~> 3 DESC LIMIT 5;
表 F.4显示了可用的函数。
表 F.4 立方体函数
函数 描述 示例 |
---|
创建一个一维立方体,其两个坐标相同。
|
创建一个一维立方体。
|
使用数组中定义的坐标创建零体积立方体。
|
使用两个数组定义的右上角和左下角坐标创建立方体,这两个数组的长度必须相同。
|
通过在现有立方体上添加一个维度来创建一个新的立方体,新坐标的两个端点具有相同的值。这对于根据计算值逐个构建立方体非常有用。
|
通过在现有立方体上添加一个维度来创建一个新的立方体。这对于根据计算值逐个构建立方体非常有用。
|
返回立方体的维度数。
|
返回立方体左下角的第
|
返回立方体右上角的第
|
如果该立方体是一个点,即两个定义的角是相同的,则返回 true。
|
返回两个立方体之间的距离。如果两个立方体都是点,则这是正常的距离函数。
|
使用数组中的维度索引列表,根据现有立方体创建一个新立方体。可用于提取单个维度的端点,或删除维度,或按需要重新排列维度。
|
生成两个立方体的并集。
|
生成两个立方体的交集。
|
将立方体的大小至少在
|
F.11.4. 默认值#
此联合
select cube_union('(0,5,2),(2,3,1)', '0');
cube_union
-------------------
(0, 0, 0),(2, 5, 2)
(1 row)
既不违背常识,交集也不违背常识
select cube_inter('(0,-1),(1,1)', '(-2),(2)');
cube_inter
-------------
(0, 0),(1, 0)
(1 row)
在对不同维度立方体的任何二元运算中,低维度立方体被假定为笛卡尔投影,即在字符串表示中用零代替省略的坐标。上述示例等同于
cube_union('(0,5,2),(2,3,1)','(0,0,0),(0,0,0)');
cube_inter('(0,-1),(1,1)','(-2,0),(2,0)');
以下包含谓词使用点语法,而实际上第二个参数在内部由一个框表示。此语法使得不必定义一个单独的点类型和用于 (box,point) 谓词的函数。
select cube_contains('(0,0),(1,1)', '0.5,0.5');
cube_contains
--------------
t
(1 row)
F.11.5. 注释#
有关用法示例,请参见回归测试sql/cube.sql
。
为了让人们更难破坏事物,立方体维度数量的限制为 100。如果您需要更大的数量,请在cubedata.h
中设置。
F.11.6. 鸣谢#
最初作者:Gene Selkov, Jr.<[[email protected]](/cdn-cgi/l/email-protection#295a4c4542465f435b69444a5a07484745074e465f)>
,数学与计算机科学部,阿贡国家实验室。
我首先要感谢 Joe Hellerstein 教授 (https://dsf.berkeley.edu/jmh/),他阐明了 GiST (http://gist.cs.berkeley.edu/) 的要点,还要感谢他以前的学生 Andy Dong,他为 Illustra 编写了示例。我也感谢所有 Postgres 开发者,无论过去还是现在,他们让我能够创造自己的世界并安然无恙地生活在其中。我还要感谢阿贡实验室和美国能源部多年来对我数据库研究的忠实支持。
此软件包的次要更新由 Bruno Wolff III<[[email protected]](/cdn-cgi/l/email-protection#9bf9e9eef5f4dbecf4f7fdfdb5eff4)>
在 2002 年 8 月/9 月完成。这些更新包括将精度从单精度更改为双精度,并添加了一些新函数。
Joshua Reich<[[email protected]](/cdn-cgi/l/email-protection#670d08140f271508081349090213)>
在 2006 年 7 月进行了其他更新。这些更新包括cube(float8[], float8[])
,并清理了代码以使用 V1 调用协议,而不是弃用的 V0 协议。