本模块实现了一个名为 cube
的数据类型,用于表示多维立方体。
此模块被认为是“受信任的”,这意味着非超级用户也可以在其拥有的数据库上安装它,前提是他们具有 CREATE
权限。
表 F.1 显示了 cube
类型的有效外部表示。 x
、 y
等表示浮点数。
表 F.1. Cube 外部表示
外部语法 | 含义 |
---|---|
|
一维点(或零长度的一维区间) |
( |
同上 |
|
n 维空间中的一个点,在内部表示为一个零体积的立方体 |
( |
同上 |
( |
一维区间,起始点为 x ,终点为 y ,或反之;顺序无关紧要 |
[( |
同上 |
( |
一个 n 维立方体,由其对角线上的两个顶点表示 |
[( |
同上 |
输入对角顶点时,它们的顺序并不重要。 cube
函数会自动交换值以创建统一的“左下 - 右上”内部表示。当顶点重合时,cube
只存储一个顶点并带有一个“是点”标志,以避免浪费空间。
输入时会忽略空格,因此 [(
与 x
),(y
)][ (
相同。x
), ( y
) ]
值以 64 位浮点数形式存储。这意味着超过约 16 位有效数字的数字将被截断。
表 F.2 显示了为 cube
类型提供的专用运算符。
表 F.2. Cube 运算符
运算符 描述 |
---|
两个立方体是否重叠? |
第一个立方体是否包含第二个立方体? |
第一个立方体是否被包含在第二个立方体中? |
提取立方体的第 |
提取立方体的第 |
计算两个立方体之间的欧几里得距离。 |
计算两个立方体之间的出租车距离(L-1 度量)。 |
计算两个立方体之间的切比雪夫距离(L-inf 度量)。 |
除了上述运算符之外,cube
类型还支持 表 9.1 中显示的常规比较运算符。这些运算符首先比较第一个坐标,如果它们相等,则比较第二个坐标,依此类推。它们主要用于支持 cube
的 b-tree 索引运算符类,例如,当您希望对 cube
列设置 UNIQUE 约束时,这可能很有用。否则,这种排序的实际用途不大。
cube
模块还为 cube
值提供了一个 GiST 索引运算符类。 cube
GiST 索引可用于在 WHERE
子句中使用 =
、 &&
、 @>
和 <@
运算符搜索值。
此外,cube
GiST 索引还可用于使用 ORDER BY
子句中的度量运算符 <->
、 <#>
和 <=>
来查找最近邻。例如,可以使用以下命令高效地查找 3D 点 (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;
以及按右上角第一个坐标降序排序的 2D 立方体:
SELECT c FROM test ORDER BY c ~> 3 DESC LIMIT 5;
表 F.3 显示了可用的函数。
表 F.3. Cube 函数
函数 描述 示例 |
---|
创建一个一维立方体,两个坐标值相同。
|
创建一个一维立方体。
|
使用数组定义的坐标创建一个零体积的立方体。
|
创建一个立方体,其右上角和左下角坐标由两个数组定义,这两个数组的长度必须相同。
|
通过向现有立方体添加一个维度来创建一个新立方体,新坐标的两个端点值相同。这有助于按部就班地构建立方体。
|
通过向现有立方体添加一个维度来创建一个新立方体。这有助于按部就班地构建立方体。
|
返回立方体的维度数。
|
返回立方体左下角第
|
返回立方体右上角第
|
如果立方体是点(即两个定义角相同),则返回 true。
|
返回两个立方体之间的距离。如果两个立方体都是点,则这是常规距离函数。
|
使用数组中的维度索引列表,从现有立方体创建一个新立方体。可用于提取单个维度的端点,或删除维度,或按所需顺序重新排列它们。
|
生成两个立方体的并集。
|
生成两个立方体的交集。
|
将立方体在至少
|
此并集
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)');
以下包含谓词使用了点语法,但实际上第二个参数在内部由一个盒子表示。这种语法使得无需为(盒子,点)谓词定义单独的点类型和函数。
select cube_contains('(0,0),(1,1)', '0.5,0.5'); cube_contains -------------- t (1 row)
原作者:Gene Selkov, Jr. <selkovjr@mcs.anl.gov>
,阿贡国家实验室数学与计算机科学部。
我最感谢的是 Joe Hellerstein 教授(https://dsf.berkeley.edu/jmh/),他阐明了 GiST 的核心思想(http://gist.cs.berkeley.edu/),以及他的前学生 Andy Dong 为 Illustra 编写的示例。我还感谢所有 Postgres 的开发者(现任和前任),他们使我能够创造自己的世界并安宁地生活其中。我还要感谢阿贡实验室和美国能源部多年来对我的数据库研究提供的坚定支持。
Bruno Wolff III <bruno@wolff.to>
于 2002 年 8 月/9 月对该软件包进行了小幅更新。这些更新包括将精度从单精度改为双精度,并添加了一些新函数。
Joshua Reich <josh@root.net>
于 2006 年 7 月进行了其他更新。这些更新包括 cube(float8[], float8[])
函数,以及将代码清理为使用 V1 调用协议而不是已弃用的 V0 协议。
如果您在文档中发现任何不正确之处、与您在使用特定功能时的体验不符之处,或者需要进一步说明之处,请使用 此表单 报告文档问题。