Typologie-Referenz — Spaltentypen & Roll-up
Die Typologie ist die Art, wie eine Gold-Spalte deklariert, welche Art von
Wert sie ist — eine Messgroesse, ein Identifikator, ein geordneter Rang, eine
Kategorie. Jede Spalte traegt ihren Typ im column_types:-Block der Entity-YAML,
Geschwister zur Rollenregistrierung columns:.
Eine Zahl ohne deklarierten Typ ist undeklariert — keine Lizenz zum Raten. Der
Compiler (typologycheck.py) verifiziert jede Deklaration; der KLS
traegt nur Daten. Typen sind Deklarationen, keine Laufzeitdaten.
Konzeptioneller Hintergrund: Sense 54 — The Typology und Sense 53 — The Codex.
Wo er deklariert wird
Abschnitt betitelt „Wo er deklariert wird“# entities/<entity>.yamlcolumn_types: material_id: { kind: identifier, subkind: foreign_key, references: materials.material_id } quantity: { kind: quantity, standard: null, rollup: additive } unit_price: { kind: quantity, standard: iso_4217, unit: CHF, rollup: non_additive } level: { kind: ordinal } # eine Baumtiefe — geordnet, nicht summierbar billing_status:{ kind: category } billing_time: { kind: temporal, subkind: instant, standard: iso_8601 }Jeder Eintrag deklariert genau ein kind, plus optionale Verfeinerungen.
Die acht Arten
Abschnitt betitelt „Die acht Arten“Jede Spalte ist genau eine:
| Art | Was es ist | Beispiele |
|---|---|---|
quantity | Ein gemessener Wert mit Einheiten und (meist) Unsicherheit | mass_g, temperature_c, unit_price |
identifier | Ein Schluessel, der eine Entitaet identifiziert — primaer, fachlich, extern, Fremdschluessel | sensor_id, serial_number, iso_country_code |
category | Ein Wert aus einem begrenzten, ungeordneten Vokabular | status, event_type, region_name |
ordinal | Ein Wert aus einer geordneten Skala — Rang / Grad / Stufe. Ordnungsfaehig, aber nicht summierbar | level (Hierarchietiefe), severity_rank |
temporal | Ein zeitfoermiger Wert — Zeitpunkt, Intervall, Dauer, Periode | phenomenon_time, deployment_window |
boolean | Zweiwertige Wahrheit (optional ein dritter Zustand) | is_active, has_calibration |
narrative | Unkontrollierter Text zum Lesen durch Menschen, nicht zum Gruppieren oder Filtern | notes, interpretation |
geometry | Strukturierte raeumliche Daten mit einem Koordinatenreferenzsystem | boundary_geojson |
Die Grenze zwischen category und ordinal ist die Ordnung: eine Kategorie
ist eine schlichte Menge (Status, Ereignistypen); ein Ordinal ist eine gereihte
Skala, in der min/max/median sinnvoll sind, eine Summe aber nicht (Rang 1 +
Rang 2 ≠ Rang 3).
Deklarationsfelder
Abschnitt betitelt „Deklarationsfelder“| Feld | Gilt fuer | Bedeutung |
|---|---|---|
kind | alle | Eine der acht Arten oben (erforderlich) |
subkind | alle | Verfeinert die Art — identifier.foreign_key, temporal.instant, geometry.polygon |
standard | quantity, temporal, geometry | Eine Codex-Standard-ID (ucum, iso_4217, iso_8601, rfc_7946_geojson). Der Pruefer erzwingt, dass sie die Art legal bindet |
unit | quantity | Statische Einheit — UCUM fuer physikalische Groessen, ein ISO-4217-Code (CHF) fuer Waehrung |
unit_column | quantity | Polymorphe Einheit — pro Zeile in einer Geschwisterspalte getragen (log-foermige Daten) |
references | identifier.foreign_key | Fremdschluessel-Ziel als entity.column |
derived_from | quantity | {entity, column, standard} — eine typisierte Kante: diese Spalte wird aus einer anderen durch eine zitierte Umrechnung erzeugt |
rollup | quantity | Roll-up-Richtlinie eine Hierarchie hinauf — siehe unten |
Roll-up — wie eine Messgroesse eine Hierarchie hinauf aggregiert
Abschnitt betitelt „Roll-up — wie eine Messgroesse eine Hierarchie hinauf aggregiert“rollup beantwortet: wenn diese Spalte ueber die Kinder eines Hierarchieknotens
zusammengefasst wird (die Level Ladder — siehe Sense 42 — The Landscape),
was ist das ehrliche Aggregat? Es ist eine Eigenschaft des Typs (intensiv
vs. extensiv), keine Anzeige-Konfiguration — es kaskadiert nie und ueberschreibt nie.
| Wert | Aggregat | Verwendung fuer |
|---|---|---|
additive | SUM | Extensive Groessen — Zaehlungen, Lasten, Geldsummen. Summieren ist ehrlich |
averageable | AVG | Intensive Groessen, die sich mitteln lassen — eine bereits pro Einheit normalisierte Rate |
non_additive | rollt nicht | Preise, Extrema (min/max), Verhaeltnisse, Prozentwerte, vorberechnete Mittelwerte. Weder Summe noch Mittel ist ehrlich |
distinct_count | COUNT(DISTINCT …), neu berechnet ueber den Teilbaum | Gruppenwerte, die Neuberechnung statt Aggregation der Teile brauchen (distinct-einer-Vereinigung ≠ Summe-der-distinct-Werte) |
Eine knoteuebergreifende Summe und ein Anteil in % sind nur fuer
additive sinnvoll — die „Summe” einer Menge von Mittelwerten oder
distinct-Zaehlungen ist nicht ihre Summe.
Ein undeklariertes Rollup rollt nicht
Abschnitt betitelt „Ein undeklariertes Rollup rollt nicht“rollup an einer Messgroesse wegzulassen ist keine Anweisung zu summieren. Ein
undeklariertes Rollup bedeutet, dass die Groesse ueberhaupt nicht hinaufrollt — denn
Raten ist die falsche Handlung. Eine Deklaration heisst, ein Mensch hat entschieden,
aktenkundig; ein stiller Standard heisst, die Engine hat entschieden, unsichtbar, wo
eine falsche Zahl genau wie eine richtige aussieht. Siehe das Prinzip „keine stillen
verhaltensbestimmenden Standards” (Sense 54 — The Typology).
Die Typologie-Abdeckung zaehlt eine Messgroesse ohne Rollup als Luecke, sodass
eine nicht rollende Groesse sichtbar ist, nicht nur still wirkungslos.
ordinal, category, identifier usw. tragen kein rollup — sie werden nicht
eine Hierarchie hinauf summiert.
Abdeckung
Abschnitt betitelt „Abdeckung“jin make baeckt eine reine Inspektor-Tabelle typology_coverage pro Entitaet:
typisierte / untypisierte / Phantom-Spalten und einen Abdeckungsgrad in %.
Vollstaendige Abdeckung — jede Gold-Spalte typisiert, jedes Rollup einer
Messgroesse deklariert — ist eine Data-Engineering-Anforderung, keine zu
optimierende Kennzahl. Den vollstaendigen Typ einer einzelnen Spalte am
Einsatzpunkt inspizieren Sie ueber den Column Passport.
Befehle
Abschnitt betitelt „Befehle“# Jede column_types-Deklaration validieren (kind + Codex-Bindung + Rollup-Vokabular)python3 scripts/typologycheck.pypython3 scripts/typologycheck.py entities/cases.yaml # eine oder mehrere explizite Dateien
# Die Inspektor-Tabellen backen (laeuft in `jin make` als Post-dbt-Schritt)python3 scripts/typologycompile.py --kls <kls> --tenant <t> --entities-root <afs>/entitiesSiehe auch
Abschnitt betitelt „Siehe auch“- Entity-YAML-Referenz — die vollstaendige Entity-Datei, von der
column_types:ein Block ist - Sense 54 — The Typology — die Design-Begruendung
- Sense 53 — The Codex — die Standards-Registrierung
- Inspizieren — Portraits & Passports — den Typ einer Spalte am Einsatzpunkt lesen