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 个这样的列
Checkin:id, user_id, location_id, approved, amount, number, checkin_date, status, qr_code, barcode, points_earned
和 30 多个这样的列。
这里
- id - 主键。整数
- table_id - 外键。例如accounts中的user_id,table指向用户table.
中的用户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.
如果我这样理解,是不是意味着:
- 只有 table:拥有 100+ 列的用户(数据来自所有这些 tables(帐户、签到等)
- 将有一个用户 table 和一个事件 table。用户 datable 将拥有与当前 mysql 中完全相同的架构。 events table 将存储实际数据签到、帐户。
- 一些其他类型的架构?
此外,我可以找到更多资源来深入了解 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(大)。
我在 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 个这样的列
Checkin:id, user_id, location_id, approved, amount, number, checkin_date, status, qr_code, barcode, points_earned
和 30 多个这样的列。
这里
- id - 主键。整数
- table_id - 外键。例如accounts中的user_id,table指向用户table. 中的用户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.
如果我这样理解,是不是意味着:
- 只有 table:拥有 100+ 列的用户(数据来自所有这些 tables(帐户、签到等)
- 将有一个用户 table 和一个事件 table。用户 datable 将拥有与当前 mysql 中完全相同的架构。 events table 将存储实际数据签到、帐户。
- 一些其他类型的架构?
此外,我可以找到更多资源来深入了解 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(大)。