What data modeling forbids
What the layer forbids
Six things this mechanism will not give you, at any price:
- You cannot recover a grain you did not store. Aggregation is the one irreversible operation in the stack.
- You cannot sum a measure across a dimension it is not additive over. This is arithmetic, not convention.
- You cannot join across grains without either an allocation rule or double counting. And the allocation rule is unverifiable.
- You cannot answer both as-was and as-is from one stored version. This is information-theoretic, not an implementation gap.
- You cannot centralize meaning retroactively without restating history. By the time the divergence is visible, consumers have built on the variants.
- No schema encodes agreement. A model is the residue of a negotiation, never a substitute for one.
Escapes and their prices
| Escape | Buys | Pays |
|---|---|---|
| Atomic grain | every future question stays open | storage linear in events, aggregation per query |
| SCD2 / versioned dimensions | as-was joins | unbounded versions, surrogate machinery, late-arrival rewrites |
| Type 4 mini-dimension | bounds version explosion on volatile attributes | an extra join and a split vocabulary |
| Bridge + weights | additive many-to-many rollups | an unverifiable allocation baked into a column |
| Vault / anchor (late binding) | schema resilience, source attribution, parallel loads | read-side complexity; the presentation layer is still required |
| OBT / wide marts (early binding) | zero-join consumption | grain lock-in, rewrite on dimension change, table proliferation |
| Semantic layer | one definition, enforced additivity | a query compiler plus a governance bottleneck |
| Event sourcing | retroactive new projections | snapshots, immutable event semantics, no canonical state |
| Activity schema | no conformance negotiation | every question is a temporal self-join |
| Medallion boundaries | replay points at trust changes | 3× storage, summed latency, worthless without published guarantees |
| Entity resolution | identity without a shared key | threshold-dependent counts, restatement on every merge |