【问题标题】:Denormalising mysql tables for google bigquery为 google bigquery 非规范化 mysql 表
【发布时间】:2015-06-25 10:45:40
【问题描述】:

我在 Mysql 中有以下架构(针对这个问题进行了简化。实际上它包含的表比这里给出的要多)

用户id, email, first_name, last_name, gender, birthday 和另外 30 个这样的列

帐户id, user_id, total_visits, total_credits, total_redemptions, total_debits, points, initial_credit, initial_debit 和另外 20 个此类列

签入id, user_id, location_id, approved, amount, number, checkin_date, status, qr_code, barcode, points_earned 和 30 多个此类列。

这里

  1. id - 主键。整数
  2. table_id - 外键。例如accounts中的user_id,table指向User表中用户的id col。

要导入这个, advice in the docs,是:

在 BigQuery 中,您通常希望对数据结构进行非规范化以实现超快速查询。虽然 BigQuery 可以在小型数据集上进行 JOIN,但它们的性能不如非规范化结构。使用嵌套/重复功能可以实现某种类型的规范化。

如果我理解这一点,那是否意味着:

  1. 只有表:具有 100+列的用户(所有这些表中的数据(帐户、签到等)
  2. 将有一个用户表和一个事件表。用户 datable 将具有与 mysql 中当前具有的完全相同的架构。 events 表将存储实际数据签到、帐户。
  3. 其他类型的架构?

此外,我们能否找到更多深入了解 Bigquery 的非规范化 mysql 表的资源?

【问题讨论】:

    标签: mysql database-schema google-bigquery


    【解决方案1】:

    在 BigQuery 中设计架构时,查看表统计信息很重要。 BigQuery 有两种主要的 JOIN 算法实现——一种非常快,但可以扩展到几 MB,另一种可以扩展到任何大小,但速度较慢。 让我们看一下 User 表。如果您正在处理数千万用户 - 此表可能会超过 10 MB,但如果您有数万用户 - 它将远低于该限制。在这种情况下,您可以将其保留为单独的表,而不会牺牲性能。 因此,如果数字运行良好 - 那么我会推荐类似于方法 2 的方法 - 一个用户表(小)和一个事件表(大)。

    【讨论】:

      【解决方案2】:

      这是构建用于报告目的的数据库时的常见需求。通常,我们更喜欢规范化模式以实现快速写入、低磁盘空间和数据完整性,但在报告时,我们更喜欢高度聚合的非规范化模式,因此只需要读取单个表即可。

      如果可能的话,我会努力争取一张桌子。转到您的最低粒度级别,可能是您的checkin.id 并从那里加入您的其他表,仅获取您在 bigquery 中需要的字段。

      至于列数,我不会太担心。我们在 SAP BW 中构建了单个对象数据存储,这些数据存储被非规范化到包含时间点客户信息、公司层次结构、物料/sku 属性、非规范化为月、季度、年和会计期间的日期的发票行。最后,我们通常有超过 200 列。这比在查询运行时通过更规范化的模式实时加入要快得多。事实上,规范化的模式甚至可能不会返回。

      感觉不对,但是当您的主要目标是快速数据检索,而不是磁盘空间、复制数据以及我们在构建前端时担心的所有其他事情时,那么完全非规​​范化的数据就是目标。

      【讨论】:

        猜你喜欢
        • 2013-08-21
        • 2018-06-06
        • 2013-01-08
        • 1970-01-01
        • 1970-01-01
        • 2011-11-12
        • 1970-01-01
        • 1970-01-01
        • 2012-12-31
        相关资源
        最近更新 更多