Prefix: meta_.
The schema describing itself: which families exist, where the exceptions live, and how the roster closes against the relations actually observed. These rows are versioned with the schema definition and never change at run time. The reference pages you are reading are rendered from this family’s rows and the comments beside them.
Where to start
- meta_family
-
The family roster: one row per relation-name prefix, keyed by the prefix under the schema’s naming discipline (a family is named for whose vocabulary its rows are written in, never for its reader or its role).
- meta_relation_family
-
The census that closes the roster: every relation in the schema, its kind, the family whose prefix covers it, and whether an exemption row places it.
- meta_materialize
-
The register of materialized derivations: which derived views are refilled into which tables, and why.
How this family meets the others
No crossing is declared for this family and no foreign key crosses its boundary; its rows meet the other families' only where a reader joins them.
Why the name is right
The schema’s own description: the family roster, each family’s headline relations and its sanctioned normalization crossings, the placement of relations no prefix covers, the census that closes both rosters against the observed schema, the declared key edges resolved out of the engine’s catalog, the register of which derived views are materialized into which tables, and the register’s derived refresh edges. Rows that are a function of this file alone, versioned with the DDL they describe and never refreshable apart from it, which is the property that matters and which every form in the family keeps: a roster stated as a VALUES view has rows that are part of the definition, and the register stated as a table has rows an INSERT in this same file supplies before any run opens the store. The register takes the table form because it is the one resident whose rows a constraint should defend, a key on the source view and NOT NULL on all three columns, and a view can carry neither; the two older rosters keep the view form until an item converts them. meta_materialize_dependency is the family’s one machine-written resident: unlike its authored siblings its rows come from one boot-time routine that derives them from the stored view definitions, so a hand edit is a bug, the same standing meta_relation_family’s comment claims for its derivation, here as a table because transitive reach through unregistered intermediate views is not a plain SQL view’s to express. Not store_, because these rows are a statement of what this file declares, never a record of what a run read.
meta_family (view)
The family roster: one row per relation-name prefix, keyed by the prefix under the schema’s naming discipline (a family is named for whose vocabulary its rows are written in, never for its reader or its role). The introduction column presents each family to a first-time reader and the definition column carries its charter, the latter migrated out of this file’s header so the roster has one home; the generated schema reference renders one page per row, ordered by ordinal, and the schema gates close the roster against the observed relations in both directions.
prefix(CHARACTER VARYING, nullable)-
the family’s relation-name prefix, trailing underscore included; the roster’s key, unique by gate since a view carries no PRIMARY KEY, and no prefix may be a prefix of another (gated), which is what lets the census match exactly
title(CHARACTER VARYING, nullable)-
the family’s rendered page title in the generated schema reference; plain prose, display material only
ordinal(INTEGER, nullable)-
the family’s position in the reference’s page order and index roster, 0-based; unique by gate
introduction(CHARACTER VARYING, nullable)-
the family’s introduction: one short paragraph presenting the family to a first-time reader, in plain language, saying what its rows transcribe or derive. It opens the family page, where the charter beside it now sits under its own heading further down; the two are complements, the introduction presenting and the charter defending the name. An introduction deliberately names no relation and no other family. The headline roster and the meeting section carry those, and both are gated, so a name stated here instead would go stale with nothing failing. No gate can read intent, which is what makes this comment the enforcement.
definition(CHARACTER VARYING, nullable)-
the family’s charter: whose vocabulary its rows are written in and why the name is right, rendered on the family page under its own heading, below the introduction and the two rosters the page now opens with
meta_family_bridge (view)
The sanctioned normalization crossings: one row says that this relation owns the rule by which a name written in one family’s vocabulary is matched against another family’s census. How two families meet is a fact about the schema rather than prose an author writes about it, so the crossings are declared here in the DDL the way the family roster and the materialization register are, and the reference renders the declarations. What the roster defends against is a fork: a new view can re-derive a normalization with its own function calls in a join predicate, produce plausible rows, and quietly leave two rules where the schema states one. Membership is two tests together. A relation is on the roster when it owns a normalization rule of its own, spelled in its own body, not when it reads a relation that states one; and when that rule mediates a meeting between two families' vocabularies, not a normalization inside one. Where the DDL assigns a rule’s ownership in its own comments, the roster follows that assignment, so a coordinate-shaped sibling whose comment says the rule is argued at the other site restates a body rather than a rule and earns no second row. Crossings by plain column equality on a shared natural key are deliberately absent: a foreign key is already a declared, engine-checked join path, and an identity comparison has no rule to re-derive differently, so there is nothing a new view could silently fork. The declarations are resolve-gated only. Whether they cover every crossing the views actually perform is a derivation over the view-read census, which no declaration can answer on its own, and until that closure exists the reference presents these rows as declarations and claims no exhaustiveness.
relation_name(CHARACTER VARYING, nullable)-
the relation owning the rule, named as a consumer reads it; must resolve to an observed relation (gated). For a registered reduction that is the canonically named relation rather than its source view, whose own comment tells readers not to spell it, since the reference cross-links what a row names and a register carrying reader-facing names gets that right by construction. A gate closing this roster against what a view’s stored definition reads therefore has to resolve such a row through meta_materialize to the source view first.
spelled_prefix(CHARACTER VARYING, nullable)-
the family whose vocabulary the name is written in, a meta_family prefix; rostered, and distinct from census_prefix (both gated). Named for the role rather than as one half of a from-and-to pair, because a normalization always has a spelled side and a census side while a direction pair would assert something the population only usually carries, and would read ambiguously against the bridge’s own residence family.
census_prefix(CHARACTER VARYING, nullable)-
the family whose census the written name is matched against, a meta_family prefix; rostered, and distinct from spelled_prefix (both gated). The role name is true of every row for the same reason its spelled counterpart is.
rule(CHARACTER VARYING, nullable)-
the rule in one sentence: what meets what, and by what normalization. Non-blank (gated), and prose no gate can check beyond that, which is why it stays one sentence stating the rule the relation’s own body spells rather than restating the body.
meta_family_headline (view)
The headline roster: the relations a reader should meet first in each family, typically its central grain plus the derivations that make the grain useful. Curation is judgment, which is why membership is authored here and nothing else about a row is: the family comes from the meta_relation_family census by join rather than being stored beside the name, and what each headline means comes from the relation’s own comment, so there is no second blurb to drift from the first. The generated schema reference renders the roster as the family page’s starting point, each entry the relation name linked to its own entry further down the page plus the first sentence of that comment. Not named for the store glossary’s word grain, which this roster does not mean: a reader of the reference must never have to disambiguate a load-bearing word.
relation_name(CHARACTER VARYING, nullable)-
the headline relation’s name as declared; the roster’s subject, and it must resolve to an observed relation that the census places in a family (gated). The family follows from that census row, so a relation moving between families moves its headline with it and no second copy can disagree.
ordinal(INTEGER, nullable)-
the headline’s position within its own family’s roster, 0-based; dense from zero within each family (gated), which is the schema-gate convention here because uniqueness alone would let a gap through and a gap is how a dropped row hides. Every family carries at least one row, single-relation families listing their one resident.
meta_materialize
The register of materialized derivations: which derived views are refilled into which tables, and why. One row is one registration, read by the materializer on the capture cadence, which empties the target and refills it from the source view inside the capture transaction, per graph where the relation is graph-keyed and whole where it is not. The pair is directional and the direction is the whole point, which is why both columns say which end they are. A registration is invisible to consumers by construction: the canonical name every existing reader already spells is the name the target table takes, and the view stating the rule is what gets renamed, so no reader is edited and the rule is still written exactly once. The register itself carries no ordering; where one registered view reads another registration’s target, that fact is derived from the stored view definitions into meta_materialize_dependency at boot, and the materializer refreshes in an order respecting every row of it.
Primary key: (source_view_name).
source_view_name(CHARACTER VARYING, not null)-
The view stating the rule, which is the relation the target’s rows are computed from. It carries its original view text unchanged under a name it did not previously have, the canonical name having moved to the target; a consumer naming this relation is asking for on-demand evaluation and will get it, which is a performance bug rather than a wrong answer, and the inline-multiplicity check is what finds one.
target_table_name(CHARACTER VARYING, not null)-
The table the rows are materialized into, under the name every existing reader already uses. That is what makes a registration invisible to consumers: the other view bodies naming this relation are not edited, they simply stop hitting a view and start hitting a table, and so does any Java reader of the same name. A registration that gave the target a new name would change no reader’s cost and would be pointless.
reason(CHARACTER VARYING, not null)-
Why this relation is materialized rather than left to derive on read. Required, because this column is where half the materialization doctrine lives: a hand-written derivation argues in its own table comment that no view could express its rule, and a registration argues instead that a view expresses the rule correctly and only too slowly, so a row that cannot say which is not a registration.
meta_materialize_dependency
The registry’s derived refresh edges: one row per registration whose source view reads, directly or through unregistered intermediate views, the target table of another registration, which must therefore refresh first. The family’s one machine-written resident: the rows are a function of this file alone, computed once per booted store by the population routine beside the materializer (no.sikt.graphitron.model.derive.MaterializeDependencies), which parses the stored view definitions and rewrites this relation before the first refresh, so a hand edit is a bug the next boot undoes, the same standing meta_relation_family’s comment claims for its derivation. A table rather than a view because transitive reach through unregistered intermediate views is not a plain SQL view’s to express. The materializer refreshes in a topological order over these rows with an alphabetical tie-break, so a row-free relation orders exactly as the registry’s own key does; a cycle among registrations is a registration error the build-time gate refuses, no refresh order making every target equal its view on a settled store.
Primary key: (source_view_name, depends_on). Foreign key: (source_view_name) references meta_materialize (source_view_name). Foreign key: (depends_on) references meta_materialize (source_view_name). Check: "SOURCE_VIEW_NAME" <> "DEPENDS_ON".
source_view_name(CHARACTER VARYING, not null)-
The dependent registration, named by its key in meta_materialize: the one whose source view performs the read, and which must therefore refresh after the registration named beside it.
depends_on(CHARACTER VARYING, not null)-
The prerequisite registration, named by its key in meta_materialize: the one whose target table the dependent’s view reads, and which must therefore refresh first. Always another registration; the length-one cycle, a view reading its own target, is refused declaratively by the CHECK.
meta_prefixless_relation (view)
The placement exemptions: one row per relation deliberately outside every family, in the exemption polarity the schema gates use throughout, so a new prefix-less relation fails the roster gate until an authored row argues it in. The page column places the relation in the generated reference; the reason column carries the no-family argument beside the relation’s own comment.
relation_name(CHARACTER VARYING, nullable)-
the exempted relation’s name as declared; the exemption’s key, and it must resolve to an observed relation (gated)
page(CHARACTER VARYING, nullable)-
the family page that renders the relation, a meta_family prefix; NULL in the stated absent bucket: the relation belongs on no family’s page and renders on the reference’s index instead
reason(CHARACTER VARYING, nullable)-
why no family covers the relation, rendered beside the relation in the reference
meta_relation_family (view)
The census that closes the roster: every relation in the schema, its kind, the family whose prefix covers it, and whether an exemption row places it. The one relational answer to which family a relation belongs to: the schema gates, the generated reference and the docs drift guard all read this view rather than re-deriving the match, so two mechanisms of different fidelity can never answer the question differently.
relation_name(CHARACTER VARYING, nullable)-
the relation’s name as declared, lowercased from the engine’s catalog spelling
relation_type(CHARACTER VARYING, nullable)-
the engine’s kind for the relation: BASE TABLE or VIEW; both carry comments and columns and both render in the reference, but only base tables additionally carry keys and constraints
prefix(CHARACTER VARYING, nullable)-
the covering family’s prefix, by exact prefix match against meta_family; NULL where no family covers the relation, which the gates require an exemption row to justify
exempted(BOOLEAN, nullable)-
whether a meta_prefixless_relation row places this relation; TRUE must hold exactly where prefix is NULL, in both directions (gated)
meta_relation_reference (view)
The declared key edges: one row per FOREIGN KEY the schema declares, naming the relation that references and the relation referenced, each with the family the census places it in. At constraint grain deliberately, and not filtered to the edges that leave a family: cross-family is a predicate a reader applies to these rows, not a population baked into the relation, and the name says what a row is rather than where it happens to render. Resolved out of the engine’s own catalog, a referential constraint through the key columns on both ends, so the edges are exactly what the DDL declares and no second list can fall behind them. A store view rather than something a renderer aggregates for itself, because family assignment is never re-derived outside the census, and because the generated reference is only the first reader: a gate closing the declared normalization crossings and the schema surface the editor tooling reads both ask this same question. Derivation seeded by declaration is the shape the whole family relationship rests on, here the declared foreign keys.
child_relation_name(CHARACTER VARYING, nullable)-
the referencing relation, the one whose columns carry the foreign key; a base table always, since only base tables carry constraints
child_prefix(CHARACTER VARYING, nullable)-
the referencing relation’s family, from the census rather than from its name; NULL only where the census places the relation in no family, which an exemption row would have to argue
parent_relation_name(CHARACTER VARYING, nullable)-
the referenced relation, the one whose unique key the foreign key resolves against
parent_prefix(CHARACTER VARYING, nullable)-
the referenced relation’s family, from the census on the same terms as the referencing side’s