假设每种农产品可以在不同的农场生产,每个农场都有许多不同的员工。
在 BigQuery 中,拥有 3 个表以及它们之间的关系并没有错 - 但您可能还想利用 BigQuery 的嵌套和重复列支持。
对于这个虚构的例子,我们可以如下建模:
SELECT 'tomato' produce, STRUCT<farm ARRAY<STRUCT<farm_id string, employee ARRAY<STRUCT<name string>>>>>(
[
STRUCT('farm1' AS farm_id, [STRUCT('employee1' AS name), STRUCT('employee2')] AS employee )
, ('farm2', [STRUCT('employee3' AS name), STRUCT('employee4')])
, ('farm3', [STRUCT('employee5' AS name), STRUCT('employee6')])
]) AS farms
UNION ALL
SELECT 'lettuce', STRUCT<ARRAY<STRUCT<farm_id string, employee ARRAY<STRUCT<name string>>>>>(
[
STRUCT('farm4' AS farm_id, [STRUCT('employee7' AS name), STRUCT('employee8')] AS employee )
, ('farm5', [STRUCT('employee9' AS name)])
]) AS farms
问:这样建模有意义吗?
答:视情况而定。
正如劳埃德所说:
在扫描分布式数据集时,嵌套记录有几个优点。首先,它们不需要连接。这意味着与每次使用时都必须重新加入额外数据相比,计算速度更快,扫描的数据也更少。
嵌套结构本质上是预先连接的表。而且,由于数据是按列存储的,如果您不引用嵌套列,则不会增加查询费用。如果您确实引用了嵌套列,则逻辑与并置连接相同。
嵌套结构带来的另一个优点是它们避免了重复数据,这些数据必须在一个宽的、非规范化的表中重复。换句话说,对于一个住在五个城市的人来说,一个宽泛的非规范化表将在五行中包含他们的所有信息(每个他们居住的城市一个)。在嵌套结构中,重复信息只占一行,因为五个城市的数组可以包含在一行中,并且只有在需要时才取消嵌套。
同时,对于不用于处理嵌套数据的用户和工具而言,查询将变得更加困难。