Skip to content
About
Main content

Summary and key takeaways

The reframe. Lower layers have an oracle (a checksum, a plan cost, a watermark). This mechanism does not. A badly modeled system works and lies. The scarce resource changes from disk access to agreement between people. Physical access cost has mostly stopped mattering (columnar storage, compression, pruning, ), so I/O arguments about are usually obsolete. The real reasons to choose a shape are semantic and organizational.

The four primitives

  • Grain: what one row is. Store the finest the source emits; cannot be undone.
  • Identity: when two references are the same thing. Always declared, never discovered.
  • Time: which version of an entity a fact joins to ( or ).
  • Boundary: where one model ends and another begins.

Modeling styles are positions on three choices: early or , precompute or compute on read, and who pays for the join (modeler once, or every reader forever). Decide per number of consumers.

Mechanisms in one line each:

MechanismOne-line lesson
Grain declarationOne row per one thing; an "and" or an aggregate word means mixed grain and double counts
NormalizationPrevents update anomalies; in stores it only protects a single point of definition
StarA rate-of-change split: events versus descriptions
SnowflakeOnly where the sub-entity has an owner; the dominant cost is path ambiguity
O(N²) reconciliations become O(N) agreements; the maps what is answerable
typesPick per attribute; storing both as-was and as-is costs a version chain
Needed because versions need an identity; hashing buys parallel loads but hard-codes trust in the business key
Additivity cannot be summed over time; ratios must be recomputed from components
Fact typesTransaction (default), (stocks), (lags, mutates), factless (absence)
Restore additivity by asserting an allocation no data can verify
Vault / anchorLate binding: resilience and audit, paid by readers; the stays
A without a refresh policy
A guard for additivity and join paths; one definition per metric
Identity by threshold; every count restates when clusters move
HierarchiesEvery read-optimized encoding pays per subtree on a move; versioning is always asked late
NestingEmbed only children with no life of their own; nesting keeps grain, flattening does not
MedallionReplay checkpoints at trust boundaries; worthless without published guarantees
Event modelingKeeps every future question open; pays in , frozen semantics,

What the layer forbids: recovering a grain you did not store; summing across a non-additive ; joining across grains without an unverifiable allocation; answering both as-was and as-is from one version; centralizing meaning without restating history; encoding agreement in a schema.

Laws that repeat:

  • Granularity mismatch generates amplification (Type 6, OBT, , nested update).
  • Costs are conserved, only relocated (to definitions, readers, storage, or headcount).
  • Variance costs more than volume (Type 4).
  • Immutable substrate grows indirection and a (SCD2, ). A missing collector means unbounded growth.
  • Independence is assumed and rarely true (single membership per fact; independent match features).
  • Unstated meaning is re-derived per consumer, producing variants deterministically.
  • scales with the people who must agree, not the data; shared vocabulary turns O(N²) into O(N).