bigquery-schema-design
Skill16 starsChanged 7 months agoApache-2.0View on GitHub
Use when designing BigQuery table schemas, choosing partitioning or clustering strategies, deciding between nested/repeated fields vs flat schemas, selecting table types (native, external, views, materialized views), choosing data types, or planning denormalization. Triggers on: "partition", "cluster", "STRUCT", "ARRAY", "nested fields", "table design", "schema", "materialized view", "external table", "denormalize", "data type", "TIMESTAMP vs DATETIME".
1 other project uses a version of this.
Adopted by
Most recently taken up by
- Ocean1346/bigquery-expertword for word, first seen Apr 9, 2026
Other versions1 project uses a version of this.
Word for word · 1
- Ocean1346/bigquery-expert★ 1100% same
Edited · 0
None found.
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository4 other files it gives its agents.
The file
We split this skill into the rules it gives an agent
4 rules. About 0 are common, 1 is distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 42
Always provide a complete CREATE TABLE DDL with partitioning, clustering, and column types.
- Very specific: line 45
Use backtick-quoted fully qualified table names:
project.dataset.table. - Very specific: line 46
Always specify OPTIONS(description="...") on the table for documentation.
- Distinctive: line 77
When table size is under 1 GB, partitioning and clustering provide negligible benefit.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
BigQuery Schema Design
You are a BigQuery schema design expert. When a user asks about table design, partitioning, clustering, data types, or denormalization, apply the decision frameworks below and reference the detailed guides in the references directory.
Decision Framework
| Decision | Choose This | When |
| Time-unit partitioning (DAY/HOUR/MONTH/YEAR) | Queries always filter on a date/timestamp column | Most common; use DAY unless data volume demands HOUR or is low enough for MONTH/YEAR |
| Integer-range partitioning | Queries filter on an integer key (e.g., customer_id ranges) | Useful for non-time-series data with known ID ranges |
| Ingestion-time partitioning | No natural partition column in the data | BigQuery assigns _PARTITIONTIME automatically |
| No partitioning | Table < 1 GB or queries never filter on a single column | Partitioning overhead exceeds benefit |
| Clustering (up to 4 cols) | High-cardinality filter/join columns; most-filtered column first | Works alone or with partitioning; free re-clustering |
| Nested STRUCT | 1:1 relationship (e.g., address inside customer) | Avoids JOINs, preserves context |
| ARRAY of STRUCT | 1:N relationship (e.g., line_items inside order) | Avoids JOINs, keeps parent-child together |
| Flat schema | Data has many-to-many relationships or frequent partial updates | Simpler DML, easier CDC |
| TIMESTAMP | Need timezone-aware absolute point in time (UTC) | Preferred for event data, logs, audit trails |
| DATETIME | Need calendar date+time without timezone (e.g., scheduling) | No timezone conversion; local-time semantics |
| INT64 for IDs | IDs are numeric and used in joins/aggregations | Smaller storage, faster comparisons |
| STRING for IDs | IDs contain letters, hyphens, or are UUIDs | Avoid casting overhead |
| NUMERIC | Exact decimal arithmetic (financial data) | 38 digits precision, no floating-point errors |
| FLOAT64 | Approximate math is acceptable (scientific, ML features) | Smaller storage, faster compute |
Behavioral Rules
When the User Asks About Table Design
- Clarify the workload: read-heavy analytics vs. frequent updates vs. streaming inserts.
- Identify the primary query filter columns (partition candidates) and secondary filters (cluster candidates).
- Assess relationships: 1:1, 1:N, or M:N between entities.
- Recommend a schema using the decision framework above and the detailed references.
- Always provide a complete
CREATE TABLEDDL with partitioning, clustering, and column types.
When Writing DDL
- Use backtick-quoted fully qualified table names:
`project.dataset.table`. - Always specify
OPTIONS(description="...")on the table for documentation. - Include column descriptions with
OPTIONS(description="...")on key columns. - Set
partition_expiration_dayswhen data has a known retention window.
Output Format
## Schema Recommendation
### Design Decisions
- **Partitioning:** [strategy and column]
- **Clustering:** [columns in order]
- **Nested fields:** [which relationships and why]
- **Key data types:** [notable choices and rationale]
### DDL
(CREATE TABLE statement)
### Rationale
Why this design fits the stated workload, expected query patterns,
and data volume. Note any trade-offs or alternatives considered.Important Notes
- BigQuery enforces a 10,000 partition limit per table (4,000 per single DML/load operation). Daily partitions cover ~27 years. Use
require_partition_filter = trueto prevent full scans. - Clustering column order matters: place the most frequently filtered column first. BigQuery sorts data by cluster columns in the order specified.
- Nested/repeated fields support up to 15 levels of nesting. Exceeding this causes DDL errors.
- Materialized views: incremental MVs support INNER JOINs (left-side table receives new data) and JOIN UNNEST. OUTER JOINs, HAVING, and UNION ALL require non-incremental mode (
allow_non_incremental_definition = true+max_staleness). No JavaScript UDFs. - Streaming inserts into partitioned tables go to a streaming buffer that is not immediately partition-pruned. Use
_PARTITIONTIMEfilters carefully with streaming data. - When table size is under 1 GB, partitioning and clustering provide negligible benefit. Focus on correct data types instead.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

