自动生成模式 - Amazon DocumentDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

自动生成模式

Amazon DocumentDB 是一个文档数据库,因此没有表和架构的概念。但是,Tableau 之类的 BI 工具将希望它连接的数据库能够呈现模式。具体来说,当 JDBC 驱动程序连接需要获取数据库中集合的模式时,它将轮询数据库中的所有集合。驱动程序将确定该集合的模式的缓存版本是否已存在。如果缓存版本不存在,它将对文档的集合进行样本并根据以下行为创建架构。

架构生成限制

DocumentDB JDBC 驱动程序将标识符的长度限制为 128 个字符。模式生成器可能会截断生成的标识符(表名和列名)的长度,以确保它们符合该限制。

扫描方法选项

可以使用连接字符串或数据源选项修改采样行为。

  • ScanMethod =<option>

    • random-(默认)-样本文档按随机顺序返回。

    • idForward-样本文件按照 ID 的顺序返回。

    • idReverse-样本文件按照 ID 的相反顺序返回。

    • 所有-对收藏中的所有文档进行样本。

  • ScanLimit=<n>-要抽样的文件数量。该值必须为正整数。默认值是 。1000. 如果扫描方法设置为所有,则忽略此选项。

DocumentDB 数据类型

DocumentDB 服务器支持多种 MongoDB 数据类型。下面列出了受支持的数据类型及其关联的 JDBC 数据类型。

MongoDB 数据类型 在 DocumentDB 中支持 JDBC 数据类型
二进制数据 VARBINARY
Boolean BOOLEAN
Double DOUBLE
32 位整数 INTEGER
64 位整数 BIGINT
字符串 VARCHAR
ObjectId VARCHAR
日期 TIMESTAMP
Null VARCHAR
正则表达式 VARCHAR
时间戳 VARCHAR
MinKey VARCHAR
MaxKey VARCHAR
对象 虚拟表
数组 虚拟表
Decimal128 DECIMAL
JavaScript VARCHAR
JavaScript(带范围) VARCHAR
未定义 VARCHAR
符号 VARCHAR
dbPointer (4.0+) VARCHAR

映射标量文档字段

在从集合中扫描文档样本时,JDBC 驱动程序将创建一个或多个架构来表示集合中的样本。通常,文档中的标量字段映射到表架构中的列。例如,在名为团队的集合中和单个文档{ "_id" : "112233", "name" : "Alastair", "age": 25 },这将映射到模式:

表名称 列名称 数据类型 密钥
球队 团队 ID VARCHAR PK
球队 名称 VARCHAR
球队 年龄 INTEGER

数据类型冲突促销

扫描抽样文档时,字段的数据类型可能在文档之间不一致。在这种情况下,JDBC 驱动程序会将 JDBC 数据类型提升为适合采样文档中所有数据类型的通用数据类型。

例如:

{ "_id" : "112233", "name" : "Alastair", "age" : 25 } { "_id" : "112244", "name" : "Benjamin", "age" : "32" }

这些区域有:年龄字段在第一个文档中为 32 位整数,但在第二个文档中为字符串。在这里,JDBC 驱动程序将将 JDBC 数据类型提升为 VARCHAR,以便在遇到时处理任何一种数据类型。

表名称 列名称 数据类型 密钥
球队 团队 ID VARCHAR PK
球队 名称 VARCHAR
球队 年龄 VARCHAR

Scalar-Scalar 冲突促销

下图显示了标量标量数据类型冲突的解决方法。

Scalar-复杂类型冲突促销

与标量类型冲突一样,不同文档中的同一字段在复数(数组和对象)和标量(整数、布尔值等)之间可能存在冲突的数据类型。对于这些领域,所有这些冲突都被解决(提升)到 VARCHAR。在这种情况下,数组和对象数据将作为 JSON 表示形式返回。

嵌入式数组-字符串字段冲突示例:

{ "_id":"112233", "name":"George Jackson", "subscriptions":[ "Vogue", "People", "USA Today" ] } { "_id":"112244", "name":"Joan Starr", "subscriptions":1 }

上面的示例映射到了 ustomer2 表的模式:

表名称 列名称 数据类型 密钥
客户 2 客户 2 VARCHAR PK
客户 2 名称 VARCHAR
客户 2 订阅 VARCHAR

和 ustomer1_订阅虚拟表:

表名称 列名称 数据类型 密钥
客户1_ 订阅 客户 1 VARCHAR PK/FK
客户1_ 订阅 订阅 _index_lvl0 BIGINT PK
客户1_ 订阅 VARCHAR
客户_地址 city VARCHAR
客户_地址 region VARCHAR
客户_地址 country VARCHAR
客户_地址 code VARCHAR

对象和数组数据类型处理

到目前为止,我们只描述了标量数据类型的映射方式。对象和数组数据类型(当前)映射到虚拟表。JDBC 驱动程序将创建一个虚拟表来表示文档中的对象或数组字段。映射的虚拟表的名称将连接原始集合的名称,后跟字段的名称,用下划线字符 (“_”) 分隔。

基表的主键 (“_id”) 在新虚拟表中使用新名称,并作为关联基表的外键提供。

对于嵌入式数组类型字段,将生成索引列以表示数组中每个级别的数组中的索引。

嵌入式对象字段示例

对于文档中的对象字段,JDBC 驱动程序创建虚拟表的映射。

{ "Collection: customer", "_id":"112233", "name":"George Jackson", "address":{ "address1":"123 Avenue Way", "address2":"Apt. 5", "city":"Hollywood", "region":"California", "country":"USA", "code":"90210" } }

上面的示例映射到客户表的架构:

表名称 列名称 数据类型 密钥
顾客 客户 ID VARCHAR PK
顾客 名称 VARCHAR

和 ustomer_address 虚拟表:

表名称 列名称 数据类型 密钥
客户_地址 客户 ID VARCHAR PK/FK
客户_地址 地址 1 VARCHAR
客户_地址 地址 2 VARCHAR
客户_地址 city VARCHAR
客户_地址 region VARCHAR
客户_地址 country VARCHAR
客户_地址 code VARCHAR

嵌入式数组字段示例

对于文档中的数组字段,JDBC 驱动程序还会创建虚拟表的映射。

{ "Collection: customer1", "_id":"112233", "name":"George Jackson", "subscriptions":[ "Vogue", "People", "USA Today" ] }

上面的示例映射到了 customer1 表的模式:

表名称 列名称 数据类型 密钥
客户 1 客户 1 VARCHAR PK
客户 1 名称 VARCHAR

和 ustomer1_订阅虚拟表:

表名称 列名称 数据类型 密钥
客户1_ 订阅 客户 1 VARCHAR PK/FK
客户1_ 订阅 订阅 _index_lvl0 BIGINT PK
客户1_ 订阅 VARCHAR
客户_地址 city VARCHAR
客户_地址 region VARCHAR
客户_地址 country VARCHAR
客户_地址 code VARCHAR