重构类型系统

来自 PostgreSQL 维基
跳转到导航跳转到搜索

需求

丰富的类型修饰符

这是 PostGIS 对 creaky typmod 系统的要求

一个 32 位整数不足以方便地描述一个类型的结构。将信息推送到用户空间,正如 PostGIS 所被迫做的那样,会使这些类型暴露于用户环境、search_path 等的变迁。

Typmod 不会在所有操作中保留,会导致意外的行为。需要为类型的数组和其他可能的复数存储单独的条目

带排序规则的类型

除了 typmod 外,可能还需要排序规则属性来支持带排序规则的类型或表达式。有关详细信息,另请参见 Todo:Collate

CREATE TABLE .. ( ..., field COLLATE <collation>, ... )
expr COLLATE <collation>

匿名 MULTISET

SQL 标准提供匿名多集

CREATE TABLE .. ( .... ROW(integer, varchar(32)) MULTISET )

泛型

一个真正的子类型系统也可能很好地支持某种泛型、类型生成器或类型接口。

请注意,当前的伪类型(anyelement、anyarray 等)只能用作函数的参数或结果类型。此外,我们只能对每个函数使用一个伪类型。

参考资料

关联数组

hstore 在 PostgreSQL 中是一个文本到文本的关联数组,但其他数据库支持类型化的关联数组数据类型。

DB2 的语法

CREATE TYPE char2int AS INTEGER ARRAY[VARCHAR(20)];

Oracle 的语法

TYPE char2int IS TABLE OF NUMBER(10) INDEX BY VARCHAR2(20);

请注意,Oracle 仅将关联数组支持为 PL/SQL 中的变量。