Adds a coordinate-based population lookup as a fallback when string name matching fails (~29% of cities). Uses bbox pre-filter (0.14° ≈ 15 km) then ST_Distance_Sphere to find the nearest GeoNames location in the same country. Fixes localization mismatches: Milano≠Milan, Wien≠Vienna, München≠Munich. Population cascade: Eurostat EU > US Census > ONS UK > GeoNames string > GeoNames spatial > 0. Coverage: 70.5% → 98.5% (5,401 / 5,481 cities with population > 0). Key cities before/after: Wien: 0 → 1,691,468 Milano: 0 → 1,371,498 München: already matched by string; verified still correct at 1,488,719 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
foundation
Business logic layer: dimensions, facts, conformed metrics. May join across staging models from different sources.
Naming convention: foundation.dim_<entity>, foundation.fact_<event>