google bigquery 的非规范化 mysql 表

Denormalising mysql tables for google bigquery

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

用户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 个这样的列

Checkinid, 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指向用户table.
  3. 中的用户id col

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

In BigQuery, you typically want to denormalize the data structure in order to enable super-fast querying. While JOINs on small datasets are possible with BigQuery, they're not as performant as a denormalized structure.Some type of normalization is possible with the nested/repeated functionality.

如果我这样理解,是不是意味着:

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

此外,我可以找到更多资源来深入了解 Bigquery 的 mysql table 反规范化吗?

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

如果可能的话,我会朝着单身 table 努力。转到你的最低粒度级别,可能是你的 checkin.id 并从那里加入你的其他 tables,只抓取你在 bigquery 中需要的字段。

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

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

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