【问题标题】:One-to-Many Relationship in BiqQueryBigQuery 中的一对多关系
【发布时间】:2018-05-22 18:46:27
【问题描述】:

假设我将实体 ABCone-to-many 关系存储在 BigQuery 中。

A -- (one to many) --> B --- (one to many) --> C

对于“常规”SQL 数据库,我将创建表 ABC,它们的主键和外键分别位于 AB 中,基于 B 的主键和C

它适用于 BigQuery 吗?将该结构反规范化并将所有ABC 存储在一个表中会更好吗?

【问题讨论】:

    标签: google-bigquery data-modeling


    【解决方案1】:

    假设每种农产品可以在不同的农场生产,每个农场都有许多不同的员工。

    在 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
    

    问:这样建模有意义吗?

    答:视情况而定。

    正如劳埃德所说:

    在扫描分布式数据集时,嵌套记录有几个优点。首先,它们不需要连接。这意味着与每次使用时都必须重新加入额外数据相比,计算速度更快,扫描的数据也更少。

    嵌套结构本质上是预先连接的表。而且,由于数据是按列存储的,如果您不引用嵌套列,则不会增加查询费用。如果您确实引用了嵌套列,则逻辑与并置连接相同。

    嵌套结构带来的另一个优点是它们避免了重复数据,这些数据必须在一个宽的、非规范化的表中重复。换句话说,对于一个住在五个城市的人来说,一个宽泛的非规范化表将在五行中包含他们的所有信息(每个他们居住的城市一个)。在嵌套结构中,重复信息只占一行,因为五个城市的数组可以包含在一行中,并且只有在需要时才取消嵌套。

    同时,对于不用于处理嵌套数据的用户和工具而言,查询将变得更加困难。

    【讨论】:

    • 非常感谢。我更喜欢 3 个有关系的表,但我害怕加入性能。这些表可能包含数千万条记录。在这种情况下,性能会成为问题吗?
    • 无需提前优化。如果达到性能成为问题的地步 - 或者 - 如果嵌套表可以让人们更轻松地进行分析,我会切换模型。
    • 我认为ABC 的一张大表对分析师来说更容易,也更容易编程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2018-09-27
    • 2011-03-30
    • 2023-01-16
    • 2015-09-20
    • 2018-03-16
    • 1970-01-01
    相关资源
    最近更新 更多