对google bigquery的mysql表进行非规范化处理

时间:2015-04-18 14:23:15

标签: mysql database-schema google-bigquery

我在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 - 外键。例如,帐户中的user_id,表指向用户表中用户的ID列。
  3. 要导入此内容, advice in the docs是:

      

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

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

    1. 只有表格:100 + columsn的用户(所有这些表格中的数据(帐户,签到等)
    2. 将有一个用户表和一个事件表。用户数据库将具有与mysql当前具有的完全相同的模式。事件表将存储实际数据签入,帐户。
    3. 其他一些架构?
    4. 此外,我们可以找到更多关于对Bigquery的mysql表进行非规范化处理的资源吗?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

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

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

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