
FDB Record Layer高级数据类型完全手册嵌套STRUCT、ARRAY与面向ML嵌入的VECTOR类型【免费下载链接】fdb-record-layerA relational database with SQL support built on FoundationDB项目地址: https://gitcode.com/gh_mirrors/fd/fdb-record-layerFDB Record Layer 是构建在 FoundationDB 之上的支持 SQL 的关系型数据库层它提供了超越传统 SQL 的高级数据类型可嵌套的 STRUCT 结构类型、灵活的 ARRAY 数组类型以及专为机器学习嵌入向量设计的 VECTOR 向量类型。本文用最小示例带你一次读懂这 3 类数据类型的声明方式、存储格式与典型用法帮你快速完成数据类型选型。为什么需要 FDB Record Layer 高级数据类型传统关系数据库只能表达行-列这种扁平结构而 STRUCT / ARRAY / VECTOR 让单条记录可以承载复杂对象、一对多集合和 ML 嵌入向量避免为每种嵌套关系都拆分多张表。FDB Record Layer 支持的完整类型体系包括类型类别支持的类型典型用途基础类型STRING、INTEGER/BIGINT、FLOAT/DOUBLE、BOOLEAN、BYTES常规字段用户自定义类型STRUCT嵌套类型、ARRAY数组类型复杂对象建模向量类型VECTOR(维度, 精度)机器学习嵌入、相似度搜索类型总览详见官方文档 sql_types.rst。一步声明嵌套 STRUCT让对象直接住进表里STRUCT也称嵌套类型本质是一个没有主键的列元组它被嵌套在外层类型内部并与宿主记录一起存储在同一位置——读取一条记录时嵌套内容完整随行返回无需二次查询。基本声明方式CREATE TYPE AS STRUCT nested_type (d INT64, e STRING) CREATE TABLE foo (a STRING, b DOUBLE, c nested_type, PRIMARY KEY(a)); 两个关键特性深度嵌套STRUCT 的列本身还可以是 STRUCT 类型嵌套层数理论上无硬性限制实践中建议控制在十几层以内受 JVM 栈大小约束。点号访问查询时可用R.author、embedding.embedding这样的点号语法直接访问嵌套字段。一个更贴近业务的例子——用 STRUCT 建模路线其中每一步是一个坐标结构CREATE TYPE AS STRUCT coordinates (X DOUBLE, Y DOUBLE) CREATE TYPE AS STRUCT route(author STRING, steps coordinates ARRAY) CREATE TABLE T(id BIGINT, R route, PRIMARY KEY(id))完整的 DDL 语法与查询示例见 STRUCT.rst。ARRAY 数组类型不 JOIN 就能表达一对多ARRAY 类型是共享同一布局的记录集合它既可以装基础类型也可以装 STRUCTCREATE TABLE T1 (a STRING, b STRING ARRAY); -- 字符串数组 CREATE TABLE T2 (a STRING, c nested_struct ARRAY); -- 结构体数组你可以把 ARRAY 列理解为一个内嵌的迷你结果集ResultSet把它拉出来之后可以像对待独立查询结果一样逐行访问。数组与结构体还可以任意深度互相嵌套。 实用技巧通过 SQL 展开Unnesting语法数组列可以被展开为行流参与查询。例如上面的路线表可以查询哪些坐标的 X 小于 10展开后每步坐标成为独立的一行配合 WHERE 过滤即可。展开语法见 Unnesting.rst。VECTOR 向量类型为 ML 嵌入向量量身定制VECTOR 类型用于存储固定维度的浮点向量是机器学习嵌入Embedding与相似度搜索场景的核心数据类型。声明语法与精度选择向量使用VECTOR(维度, 精度)声明精度决定每个元素占用的字节数精度元素大小适用场景HALF2 字节16 位半精度大批量嵌入、极致省空间FLOAT4 字节32 位单精度最常用的默认选择DOUBLE8 字节64 位双精度高精度数值计算示例CREATE TABLE embeddings ( id BIGINT, embedding VECTOR(128, FLOAT), PRIMARY KEY(id) );向量同样可以放进 STRUCT 内部例如embedding VECTOR(512, FLOAT)作为结构体字段用点号访问。存储格式与写入方式每个向量以字节数组存储首字节是类型标识0HALF、1FLOAT、2DOUBLE其余字节为大端序分量。存储大小为1 每元素字节数 × 维度例如VECTOR(128, HALF)仅占 257 字节。⚠️ 一个重要细节向量字面量不能直接写在 SQL 里正式写入需通过 JDBC 预编译语句绑定 Java 向量对象如FloatRealVector、DoubleRealVector、HalfRealVector源码位于 linear 模块在查询上下文中也可用CAST将数值数组转换为向量但数组元素个数必须与声明维度严格一致否则报错。支持的向量操作包括相等/不等比较、!、NULL 判断、IS DISTINCT FROM空安全比较以及从数值数组的 CAST 转换。HNSW 向量索引让嵌入向量支持 Top-N 相似度搜索光存向量还不够快——FDB Record Layer 内置了HNSW分层可导航小世界图向量索引支持BY_DISTANCE 距离扫描按距离顺序返回向量天然支持 Top-N 近似最近邻ANN查询多种距离度量欧氏距离、余弦相似度、点积等RaBitQ 量化压缩可把向量存储压缩 8-10 倍且能在压缩空间中直接做快速近似距离计算异步并发访问搜索与建图操作非阻塞执行并发参数可调。索引由核心层的VectorIndexMaintainer与扩展层的 HNSW 算法库协作实现架构图与全部可配置参数M、efConstruction、efSearch 等详见设计文档 vector-index-design.mdHNSW 算法实现位于 hnsw 模块。快速选型指南STRUCT、ARRAY 还是 VECTOR你的场景推荐类型理由固定结构的对象地址、坐标、联系方式STRUCT随宿主记录一体存储点号访问方便数量不定的一组同类项订单明细、标签列表ARRAY免 JOIN 的一对多建模可展开为行流模型嵌入向量文本/图像 EmbeddingVECTOR定长紧凑存储 HNSW 索引加速相似度搜索对象里带一组对象如路线含多个坐标点STRUCT ARRAY 组合可任意深度互相嵌套延伸阅读类型系统完整说明sql_types.rstSTRUCT 类型 DDL 参考STRUCT.rst数组展开Unnesting查询Unnesting.rst向量索引架构设计vector-index-design.md向量数学库RealVector 及实现linear 模块【免费下载链接】fdb-record-layerA relational database with SQL support built on FoundationDB项目地址: https://gitcode.com/gh_mirrors/fd/fdb-record-layer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考