对象-关系数据模型通过提供更加丰富的类型系统(包括复杂数据类型和面向对象)扩展了关系数据模型。AntDB在关系查询语言的基础之上扩展了对“对象-关系数据模型”的支持,用以处理更丰富的类型系统。
01 前言
在实践中,此问题可以通过将面向对象特性与数据库系统集成到一起来解决,即构建对象-关系数据库系统,为关系数据库系统添加面向对象的特性。
AntDB提供了多种面向对象的特性,自定义类型便是其中之一,下面对其用法做出介绍。
02 语法
::: hljs-center
图1:语法结构
:::
:::
03 功能详述
使用CREATE TYPE语句可以在数据库中注册一种新的数据类型。但在定义数据类型时,需要注意:
数据类型的创建者即是数据类型的拥有者。
在创建时,可以在类型名称前加上模式名指定模式,否则的话会被创建在默认的模式中。
新类型的名称必须和所在模式中的现有类型名、域名、表名不相同。
由上述语法可知,总共可以创建五种类型,分别为组合类型、枚举类型、范围类型、基础类型、shell类型。下文重点介绍前四种类型,shell类型主要在声明范围类型和基础类型时作为后续定义的前向引用,起到类型占位符的作用。
:::
3.1组合类型
语法说明中的第一种形式创建的是组合类型。组合类型由属性名和数据类型的列表来表示。如果属性的数据类型是可排序的,也可以为该属性指定一个排序规则(collation)。组合类型本质上和表的行类型是相同的,但是如果只是想定义一种类型,可以使用CREATE TYPE而不必创建一张表。
想要创建组合类型,必须拥有其所有属性类型上的USAGE权限。
::: hljs-center
表1:组合类型语法选项
:::
示例:
图2:创建组合类型
:::
:::
3.2枚举类型
语法说明中的第二种形式创建的是枚举类型。枚举类型由带引号的标签构成的列表表示,每一个标签长度必须不超过NAMEDATALEN字节(64 字节,编译时确定)。可以创建具有零个标签的枚举类型,但是在向枚举类型中添加标签之前,不能使用这种类型来保存具体的值。
::: hljs-center
表2:枚举类型语法选项
:::
::: hljs-center
图3:创建枚举类型
:::
:::
3.3 范围类型
语法说明中的第三种形式创建的是范围类型。范围类型表达的是某种元素类型(范围的子类型)的值的范围。
::: hljs-center
表3:范围类型语法选项
:::
示例:
图4:创建范围类型
:::
3.4基础类型
第四种形式创建的是基本类型。想要创建新的基本类型,必须拥有超级用户权限(做这种限制的原因是错误的类型定义会引起数据库崩溃)。上述语法定义中的参数顺序是任意的、非固定的,并且很多参数是可选参数。通常情况下参数中指定的函数必须由C语言或更底层的语言定义。
::: hljs-center
表4:基础类型语法选项
:::
::: hljs-center
图5:创建基础类型
:::
04 数组类型
当创建了一种自定义类型后,系统会自动为其创建一个关联的数组类型。数组类型名称为其元素类型的名称前加一个下划线。如果名称长度超过NAMEDATALEN字节的限定会被截断(如果生成的名称与一种现有类型的名称冲突,该过程将会重复直到找到一个不冲突的名字)。这种隐式创建的数组类型是变长的,并且使用内建的输入和输出函数(array_in以及array_out)。系统在用户自定义类型之上构建ARRAY[]时也会使用此数组类型。此数组类型会随着其元素类型的拥有者或所在模式的更改而变更,并且在其元素类型被删除时也会被删除。
此时,读者可能会存在疑问,既然系统已经自动创建了正确的数组类型,为什么还会存在ELEMENT选项。这是因为当你在创建了一个定长类型后,此类型内部恰好是某固定类型的数组,你又希望能通过下标索引其中的数据项,那么此时ELEMENT就能发挥作用。例如,point类型由两个浮点数表示,可以通过 point[0]和point[1]访问。这种方式仅限于内部是一系列明确的定长域。由于历史原因(现在已无法修改),定长数组的下标从0开始,而不是像变长数组那样从1开始。
05 兼容性
上述创建组合类型的语法符合SQL标准,其它的形式都是扩展语法。
06 总结
自定义类型提供了面向对象的最基本能力。基于类似的思想,数据库系统可以实现更多面向对象的特性。关于AntDB面向对象的更多特性将会在后续加以介绍,敬请关注。
关于AntDB数据库
AntDB数据库始于2008年,在运营商的核心系统上,为全国24个省份的10亿多用户提供在线服务,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔电信核心交易,保障系统持续稳定运行近十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。
AntDB电信级核心交易数据库-服务全国24个省份超10亿用户
发表评论