采样类型冲突
在 2.6 版本中进行了更改。
MongoDB灵活的模式模型允许给定字段包含多种类型的数据,而关系数据库将列限制为单一数据类型。 BI Connector从MongoDB中采样数据以生成关系模式模型,但当BI Connector从MongoDB文档中的字段中采样不同数据类型时,可能会发生类型转换冲突。
存在多种数据类型时,可能会出现两种主要类型的类型转换冲突:标量类型之间的冲突以及涉及文档和数组等复合类型的冲突。
注意
BI Connector 仅使用数据的采样子集来检测模式生成期间的类型冲突。 如果数据集的某个字段包含类型冲突,并且冲突类型并未同时出现在样本中,则生成的模式将无法解决这些冲突,可能会导致查询延迟增加。
有关采样配置的详细信息,例如设置 、 --samplesize
和--schemaRefreshIntervalSecs
,请参阅模式选项。
标量-标量冲突
发生标量-标量冲突时,BI Connector 使用以下格子来确定两种不同数据类型的最小上界:
例子
如果给定字段包含int
、 double
和string
类型,则最小上界为string
。
发生标量-标量冲突时,BI Connector 会在information_schema.COLUMNS
表中插入一行,并在COLUMN_COMMENT
列中列出不同的采样类型。
复合冲突
复合冲突是指涉及文档或数组的类型转换冲突。 以下部分描述了 BI Connector 如何解决这两类复合冲突。
文档冲突
当发生涉及文档的冲突时,BI Connector 将文档类型的字段显示为使用点表示法的单独列。 例如, conflict
collection 包含以下文档:
{ _id: 0, a: "foo" } // "a" is scalar (string) { _id: 1, a: { a: "bar", b: "baz" } } // "a" is composite (document)
BI Connector 检测到标量-复合冲突并生成以下关系模式:
表: conflict
_id | a | aa | ab |
---|---|---|---|
0 | "foo" |
|
|
1 |
| "bar" | "baz" |
当发生涉及文档的冲突时,BI Connector 会在information_schema.COLUMNS
表中插入一行,并在COLUMN_COMMENT
列中列出不同的采样类型。
数组冲突
当发生涉及数组的冲突时,BI Connector 会为冲突字段创建一个新表,其中包含用于外键、数组索引和值的列。 BI Connector 将数组展开为新表中的多行,并相应地填充各列。 例如, conflict
collection 包含以下文档:
{ _id: 0, a: "foo" } // "a" is scalar (string) { _id: 1, a: ["bar", "baz"] } // "a" is composite (array)
BI Connector 将上述内容呈现为以下两个表:
表: conflict
_id |
---|
0 |
1 |
表: conflict_a
_id | a_idx | a |
---|---|---|
0 |
| "foo" |
1 | 0 | "bar" |
1 | 1 | "baz" |
当发生涉及数组的冲突时,BI Connector 会:
在
information_schema.COLUMNS
表中插入一行,并在COLUMN_COMMENT
列中列出采样的所有不同类型在
information_schema.TABLES
表中插入一行,其中包含有关数组如何映射到information_schema.COLUMNS
表中的行的信息