# Schema / Canonical Data / Semantics

> Every principle in this category is listed as a record.

Page: Ontology · Principles
Canonical: https://banes-lab.com/ontology#arch-category-schema-canonical-data-semantics

Every principle in this category is listed as a record. Each record carries its kind, its severity, the scopes it applies at and the layer it lives in, then the edge relations that join it to other records, the records that point back at it, the contracts that answer to it and the tensions it takes part in. The descriptors say how it is violated, detected, measured, repaired and enforced. Where the record carries one, an exemplar shows the shape before and after the principle is applied.

Relations diagram

The relations inside this category.

```mermaid
flowchart LR
n_schema_validation["Schema Validation"]
n_type_safety["Type Safety"]
n_canonical_model["Canonical Model"]
n_canonical_data_model["Canonical Data Model"]
n_canonical_schema["Canonical Schema"]
n_canonicalization["Canonicalization"]
n_single_source_of_truth["Single Source of Truth"]
n_normalization["Normalization"]
n_semantic_consistency["Semantic Consistency"]
n_ubiquitous_language["Ubiquitous Language"]
n_intent_revealing_interface["Intent-Revealing Interface"]
n_principle_of_least_surprise["Principle of Least Surprise"]
n_database_normalization["Database Normalization"]
n_canonical_model --> n_semantic_consistency
n_canonical_model --> n_ubiquitous_language
n_canonical_model --> n_single_source_of_truth
n_canonical_data_model --> n_canonical_model
n_canonical_data_model --> n_normalization
n_canonical_schema --> n_canonical_data_model
n_canonical_schema --> n_schema_validation
n_semantic_consistency --> n_ubiquitous_language
n_ubiquitous_language --> n_intent_revealing_interface
n_intent_revealing_interface --> n_principle_of_least_surprise
n_principle_of_least_surprise --> n_intent_revealing_interface
n_database_normalization --> n_single_source_of_truth
```

### Schema Validation

- Kind: [mechanism](https://banes-lab.com/records/kind/mechanism.md)
- Severity: mandatory
- Scope: data, API, message
- Layer: [Contracts Core](https://banes-lab.com/records/layer/contracts-core.md)

Details

Requires
[Schema Contract](https://banes-lab.com/records/arch/schema-contract.md)

Reinforces
[Correctness](https://banes-lab.com/records/arch/correctness.md), [Data Contract](https://banes-lab.com/records/arch/data-contract.md)

Enables
[Fail Fast](https://banes-lab.com/records/arch/fail-fast.md), [Interoperability](https://banes-lab.com/records/arch/interoperability.md)

In tension with
[Flexible Input](https://banes-lab.com/records/lex/flexible-input.md)

Conflicts with
[Untyped Payloads](https://banes-lab.com/records/lex/untyped-payloads.md)

Referenced by
[Schema Contract](https://banes-lab.com/records/arch/schema-contract.md), [Declarative Configuration](https://banes-lab.com/records/arch/declarative-configuration.md), [Canonical Schema](https://banes-lab.com/records/arch/canonical-schema.md)

Tensions
[Schema Validation Flexible Input](https://banes-lab.com/records/tension/flexible-input-schema-validation.md)

Violated by
accepting unvalidated payloads

Detected by
missing validator at boundary

Measured by
validation coverage

Refactored by
Add Schema Validator, Add DTO

Enforced by
[runtime validation](https://banes-lab.com/records/reason/technique-runtime-validation.md), CI schema checks

Before

```typescript
const foo = JSON.parse(raw) as Foo;
```

After

```typescript
const FooSchema = object({ id: string(), name: string().min(1), count: integer().min(0) });
const foo = FooSchema.parse(JSON.parse(raw));
```

### Type Safety

- Kind: [mechanism](https://banes-lab.com/records/kind/mechanism.md)
- Severity: mandatory
- Scope: function, module, API, data
- Layer: [Contracts Core](https://banes-lab.com/records/layer/contracts-core.md)

Details

Requires
[Explicit Types](https://banes-lab.com/records/lex/explicit-types.md)

Reinforces
[Correctness](https://banes-lab.com/records/arch/correctness.md), [Contracts](https://banes-lab.com/records/lex/contracts.md)

Enables
[Static Analysis](https://banes-lab.com/records/arch/static-analysis.md)

In tension with
[Rapid Scripting](https://banes-lab.com/records/lex/rapid-scripting.md)

Conflicts with
[Dynamic Untyped Boundaries](https://banes-lab.com/records/lex/dynamic-untyped-boundaries.md), [Stringly Typed Programming](https://banes-lab.com/records/arch/stringly-typed-programming.md)

Referenced by
[Explicit Contracts](https://banes-lab.com/records/arch/explicit-contracts.md), [Data Contract](https://banes-lab.com/records/arch/data-contract.md), [Static Analysis](https://banes-lab.com/records/arch/static-analysis.md), [Compile-Time Evaluation](https://banes-lab.com/records/arch/compile-time-evaluation.md), [Liskov Substitution Principle (LSP)](https://banes-lab.com/records/arch/liskov-substitution.md), [Composite Pattern](https://banes-lab.com/records/arch/composite-pattern.md)

Tensions
[Type Safety Rapid Scripting](https://banes-lab.com/records/tension/rapid-scripting-type-safety.md)

Violated by
any/unknown maps crossing boundaries

Detected by
weak type usage, unsafe casts

Measured by
type coverage, unsafe cast count

Refactored by
Add Types, Replace Map with DTO, Narrow Types

Enforced by
compiler flags, type checker

Before

```typescript
function loadFoo(id: string): any { return fooStore.get(id); }
const count = loadFoo("x").coutn + 1;
```

After

```typescript
type FooId = string & { readonly __brand: "FooId" };
type Foo = Readonly<{ id: FooId; count: number }>;
function loadFoo(id: FooId): Foo | undefined { return fooStore.get(id); }
```

### Canonical Model

- Kind: [principle](https://banes-lab.com/records/kind/principle.md)
- Severity: contextual
- Scope: domain, integration, data
- Layer: [Contracts Core](https://banes-lab.com/records/layer/contracts-core.md)

Details

Requires
[Semantic Consistency](https://banes-lab.com/records/arch/semantic-consistency.md), [Ubiquitous Language](https://banes-lab.com/records/arch/ubiquitous-language.md)

Reinforces
[Single Source of Truth](https://banes-lab.com/records/arch/single-source-of-truth.md)

Enables
[Normalized Translation](https://banes-lab.com/records/lex/normalized-translation.md)

In tension with
[Bounded Context Autonomy](https://banes-lab.com/records/lex/bounded-context-autonomy.md)

Conflicts with
[Multiple Competing Models](https://banes-lab.com/records/lex/multiple-competing-models.md)

Referenced by
[Canonical Data Model](https://banes-lab.com/records/arch/canonical-data-model.md)

Tensions
[Canonical Model Bounded Context Autonomy](https://banes-lab.com/records/tension/bounded-context-autonomy-canonical-model.md)

Violated by
duplicate conflicting representations

Detected by
same concept modeled inconsistently

Measured by
model duplication count

Refactored by
Introduce Canonical Model, Add Translator

Enforced by
schema governance, domain review

Before

```typescript
type ApiFoo = { foo_id: string; label: string };
type DbFoo = { id: string; name: string };
type UiFoo = { key: string; title: string };
```

After

```typescript
type Foo = Readonly<{ id: FooId; name: string }>;
const fromApi = (value: ApiFoo): Foo => ({ id: fooId(value.foo_id), name: value.label });
const toUi = (foo: Foo): UiFoo => ({ key: foo.id, title: foo.name });
```

### Canonical Data Model

- Kind: [pattern](https://banes-lab.com/records/kind/pattern.md)
- Severity: contextual
- Scope: integration, enterprise data
- Layer: [Contracts Core](https://banes-lab.com/records/layer/contracts-core.md)

Details

Requires
[Canonical Model](https://banes-lab.com/records/arch/canonical-model.md), [Data Contract](https://banes-lab.com/records/arch/data-contract.md)

Reinforces
[Interoperability](https://banes-lab.com/records/arch/interoperability.md), [Normalization](https://banes-lab.com/records/arch/normalization.md)

Enables
[Cross-System Mapping](https://banes-lab.com/records/lex/cross-system-mapping.md)

In tension with
[Bounded Context Purity](https://banes-lab.com/records/lex/bounded-context-purity.md), [Local Model Autonomy](https://banes-lab.com/records/lex/local-model-autonomy.md)

Conflicts with
none

Referenced by
[Canonical Schema](https://banes-lab.com/records/arch/canonical-schema.md)

Tensions
[Canonical Data Model Bounded Context Purity](https://banes-lab.com/records/tension/bounded-context-purity-canonical-data-model.md), [Canonical Data Model Local Model Autonomy](https://banes-lab.com/records/tension/canonical-data-model-local-model-autonomy.md)

Violated by
point-to-point inconsistent mappings

Detected by
duplicated transformation logic

Measured by
transformation duplication

Refactored by
Centralize Data Mapping, Add Anti-Corruption Layer

Enforced by
data contract review

Before

```typescript
fooTable.insert({ foo_id: foo.id, foo_name: foo.name });
barTable.insert({ id: foo.id, label: foo.name });
```

After

```typescript
type CanonicalFoo = Readonly<{ id: FooId; name: string }>;
fooRepository.save(canonicalFoo);
barProjection.apply(canonicalFoo);
```

### Canonical Schema

- Kind: [artifact](https://banes-lab.com/records/kind/artifact.md)
- Severity: recommended
- Scope: data, message, API
- Layer: [Contracts Core](https://banes-lab.com/records/layer/contracts-core.md)

Details

Requires
[Canonical Data Model](https://banes-lab.com/records/arch/canonical-data-model.md)

Reinforces
[Schema Contract](https://banes-lab.com/records/arch/schema-contract.md)

Enables
[Schema Validation](https://banes-lab.com/records/arch/schema-validation.md)

In tension with
[Service-Specific Schemas](https://banes-lab.com/records/lex/service-specific-schemas.md)

Conflicts with
[Schema Drift](https://banes-lab.com/records/arch/schema-drift.md)

Referenced by
[Schema Contract](https://banes-lab.com/records/arch/schema-contract.md)

Tensions
[Canonical Schema Service-Specific Schemas](https://banes-lab.com/records/tension/canonical-schema-service-specific-schemas.md)

Violated by
divergent schemas for same concept

Detected by
schema diff conflict

Measured by
schema reuse/conformance rate

Refactored by
Align Schema, Add Versioned Schema

Enforced by
schema registry

Before

```typescript
const fooSchema = { id: "string", name: "string" };
const barFooSchema = { fooId: "text", label: "text" };
```

After

```typescript
export const CanonicalFooSchema = schema({ id: fooIdSchema, name: nonEmptyString });
fooApi.use(CanonicalFooSchema);
barProjection.use(CanonicalFooSchema);
```

### Canonicalization

- Kind: [technique](https://banes-lab.com/records/kind/technique.md)
- Severity: recommended
- Scope: input, data, security
- Layer: [Contracts Core](https://banes-lab.com/records/layer/contracts-core.md)

Details

Requires
[Canonical Format](https://banes-lab.com/records/lex/canonical-format.md)

Reinforces
[Validation](https://banes-lab.com/records/arch/validation.md), [Deduplication](https://banes-lab.com/records/lex/deduplication.md)

Enables
[Idempotency](https://banes-lab.com/records/arch/idempotency.md), [Security Checks](https://banes-lab.com/records/lex/security-checks.md)

In tension with
[Lossless Preservation](https://banes-lab.com/records/lex/lossless-preservation.md)

Conflicts with
[Ambiguous Encoding](https://banes-lab.com/records/lex/ambiguous-encoding.md)

Tensions
[Canonicalization Lossless Preservation](https://banes-lab.com/records/tension/canonicalization-lossless-preservation.md)

Violated by
comparing non-normalized forms

Detected by
duplicate semantically equivalent values

Measured by
normalization defect count

Refactored by
Normalize Input, Canonicalize Before Compare

Enforced by
validation pipeline

Before

```typescript
const keys = ["Foo", " foo ", "FOO"];
const map = new Map(keys.map(key => [key, loadFoo(key)]));
```

After

```typescript
function canonicalFooKey(value: string) { return value.trim().normalize("NFKC").toLowerCase(); }
const map = new Map(keys.map(key => [canonicalFooKey(key), loadFoo(canonicalFooKey(key))]));
```

### Single Source of Truth

- Kind: [principle](https://banes-lab.com/records/kind/principle.md)
- Severity: mandatory
- Scope: configuration, data, rule, schema
- Layer: [Contracts Core](https://banes-lab.com/records/layer/contracts-core.md)

Details

Requires
[Ownership](https://banes-lab.com/records/lex/ownership.md), [Canonical Definition](https://banes-lab.com/records/lex/canonical-definition.md)

Reinforces
[Do Not Repeat Yourself (DRY)](https://banes-lab.com/records/arch/duplicate-code.md), [Consistency](https://banes-lab.com/records/arch/consistency.md)

Enables
[Governance](https://banes-lab.com/records/arch/governance.md), [Correctness](https://banes-lab.com/records/arch/correctness.md)

In tension with
[Availability](https://banes-lab.com/records/lex/availability.md), [Decentralization](https://banes-lab.com/records/arch/decentralization.md)

Conflicts with
[Duplicated Authority](https://banes-lab.com/records/lex/duplicated-authority.md), [Magic Value](https://banes-lab.com/records/arch/magic-value.md)

Referenced by
[Do Not Repeat Yourself (DRY)](https://banes-lab.com/records/arch/duplicate-code.md), [Canonical Model](https://banes-lab.com/records/arch/canonical-model.md), [Database Normalization](https://banes-lab.com/records/arch/database-normalization.md), [Closed Vocabulary](https://banes-lab.com/records/arch/closed-vocabulary.md), [Derived Naming Registry](https://banes-lab.com/records/arch/derived-naming-registry.md)

Tensions
[Single Source of Truth Availability](https://banes-lab.com/records/tension/availability-single-source-of-truth.md), [Single Source of Truth Decentralization](https://banes-lab.com/records/tension/decentralization-single-source-of-truth.md)

Violated by
duplicate configs/rules/schemas

Detected by
conflicting definitions

Measured by
duplicate authority count

Refactored by
Centralize Definition, Reference Shared Source

Enforced by
config governance, schema registry

Before

```typescript
let fooCount = 0;
const foos: Foo[] = [];
function addFoo(foo: Foo) { foos.push(foo); fooCount += 1; }
```

After

```typescript
const foos: Foo[] = [];
function addFoo(foo: Foo) { foos.push(foo); }
function fooCount() { return foos.length; }
```

### Normalization

- Kind: [technique](https://banes-lab.com/records/kind/technique.md)
- Severity: contextual
- Scope: database, schema, data model
- Layer: [Contracts Core](https://banes-lab.com/records/layer/contracts-core.md)

Details

Requires
[Data Semantics](https://banes-lab.com/records/lex/data-semantics.md)

Reinforces
[Consistency](https://banes-lab.com/records/arch/consistency.md), [Do Not Repeat Yourself (DRY)](https://banes-lab.com/records/arch/duplicate-code.md)

Enables
[Reduced Redundancy](https://banes-lab.com/records/lex/reduced-redundancy.md)

In tension with
[Query Performance](https://banes-lab.com/records/lex/query-performance.md), [Denormalized Read Models](https://banes-lab.com/records/lex/denormalized-read-models.md)

Conflicts with
none

Referenced by
[Canonical Data Model](https://banes-lab.com/records/arch/canonical-data-model.md)

Tensions
[Normalization Query Performance](https://banes-lab.com/records/tension/normalization-query-performance.md), [Normalization Denormalized Read Models](https://banes-lab.com/records/tension/denormalized-read-models-normalization.md)

Violated by
uncontrolled duplicated data

Detected by
update anomalies, duplicated facts

Measured by
redundancy/anomaly count

Refactored by
Extract Entity, Normalize Table, Add Reference

Enforced by
schema review, database constraints

Before

```typescript
type Foo = { id: FooId; barName: string; barEmail: string };
const foos: Foo[] = duplicateBarAcrossFoos();
```

After

```typescript
type Foo = { id: FooId; barId: BarId };
type Bar = { id: BarId; name: string; email: string };
const foos = new Map<FooId, Foo>();
const bars = new Map<BarId, Bar>();
```

### Semantic Consistency

- Kind: [quality-attribute](https://banes-lab.com/records/kind/quality-attribute.md)
- Severity: mandatory
- Scope: domain, API, data
- Layer: [Contracts Core](https://banes-lab.com/records/layer/contracts-core.md)

Details

Requires
[Ubiquitous Language](https://banes-lab.com/records/arch/ubiquitous-language.md), [Semantic Contracts](https://banes-lab.com/records/arch/semantic-contracts.md)

Reinforces
[Correctness](https://banes-lab.com/records/arch/correctness.md), [Interoperability](https://banes-lab.com/records/arch/interoperability.md)

Enables
[Disambiguation](https://banes-lab.com/records/lex/disambiguation.md)

In tension with
[Polysemy Across Contexts](https://banes-lab.com/records/lex/polysemy-across-contexts.md)

Conflicts with
[Ambiguous Naming](https://banes-lab.com/records/lex/ambiguous-naming.md), [Inconsistent Error Model](https://banes-lab.com/records/arch/inconsistent-error-model.md)

Referenced by
[Data Contract](https://banes-lab.com/records/arch/data-contract.md), [Semantic Contracts](https://banes-lab.com/records/arch/semantic-contracts.md), [Domain-Driven Design (DDD)](https://banes-lab.com/records/arch/domain-driven-design.md), [Knowledge Graphs](https://banes-lab.com/records/arch/knowledge-graphs.md), [Canonical Model](https://banes-lab.com/records/arch/canonical-model.md)

Tensions
[Semantic Consistency Polysemy Across Contexts](https://banes-lab.com/records/tension/polysemy-across-contexts-semantic-consistency.md)

Violated by
same name with different meanings

Detected by
conflicting glossary/schema definitions

Measured by
semantic conflict count

Refactored by
Rename, Split Context, Add Translator

Enforced by
glossary review, schema review

Before

```typescript
function createFoo(name: string) {}
function renameFoo(label: string) {}
function findFoo(title: string) {}
```

After

```typescript
type FooName = string & { readonly __brand: "FooName" };
function createFoo(name: FooName) {}
function renameFoo(name: FooName) {}
function findFoo(name: FooName) {}
```

### Ubiquitous Language

- Kind: [activity](https://banes-lab.com/records/kind/activity.md)
- Severity: recommended
- Scope: bounded context, domain, codebase
- Layer: [Contracts Core](https://banes-lab.com/records/layer/contracts-core.md)

Details

Requires
[Domain Collaboration](https://banes-lab.com/records/lex/domain-collaboration.md)

Reinforces
[Domain-Driven Design (DDD)](https://banes-lab.com/records/arch/domain-driven-design.md), [Semantic Contracts](https://banes-lab.com/records/arch/semantic-contracts.md)

Enables
[Intent-Revealing Interface](https://banes-lab.com/records/arch/intent-revealing-interface.md)

In tension with
[Cross-Context Terminology](https://banes-lab.com/records/lex/cross-context-terminology.md)

Conflicts with
[Technical/Domain Mismatch](https://banes-lab.com/records/lex/technical-domain-mismatch.md)

Referenced by
[Semantic Contracts](https://banes-lab.com/records/arch/semantic-contracts.md), [Domain-Driven Design (DDD)](https://banes-lab.com/records/arch/domain-driven-design.md), [Domain Model](https://banes-lab.com/records/arch/domain-model.md), [Bounded Context](https://banes-lab.com/records/arch/bounded-context.md), [Domain Service](https://banes-lab.com/records/arch/domain-service.md), [Domain-Specific Language (DSL)](https://banes-lab.com/records/arch/domain-specific-language.md), [Canonical Model](https://banes-lab.com/records/arch/canonical-model.md), [Semantic Consistency](https://banes-lab.com/records/arch/semantic-consistency.md), [Closed Vocabulary](https://banes-lab.com/records/arch/closed-vocabulary.md)

Tensions
[Ubiquitous Language Cross-Context Terminology](https://banes-lab.com/records/tension/cross-context-terminology-ubiquitous-language.md)

Violated by
inconsistent domain terms

Detected by
synonym drift, ambiguous names

Measured by
naming consistency score

Refactored by
Rename Class/Method/Field, Update Glossary

Enforced by
naming rules, domain review

Before

```typescript
function changeThingState(record: any, code: string) {
record.s = code;
}
```

After

```typescript
function activateFoo(foo: Foo) {
foo.activate();
fooEvents.emit({ type: "FooActivated", fooId: foo.id });
}
```

### Intent-Revealing Interface

- Kind: [principle](https://banes-lab.com/records/kind/principle.md)
- Severity: recommended
- Scope: API, method, class, module
- Aliases: Intent-Revealing Interfaces, Intent-Revealing API
- Layer: [Contracts Core](https://banes-lab.com/records/layer/contracts-core.md)

Details

Requires
[Clear Semantics](https://banes-lab.com/records/lex/clear-semantics.md), [Naming Consistency](https://banes-lab.com/records/lex/naming-consistency.md)

Reinforces
[Principle of Least Surprise](https://banes-lab.com/records/arch/principle-of-least-surprise.md)

Enables
[Readability](https://banes-lab.com/records/lex/readability.md), [Correct Usage](https://banes-lab.com/records/lex/correct-usage.md)

In tension with
[Concise Naming](https://banes-lab.com/records/lex/concise-naming.md)

Conflicts with
[Ambiguous API](https://banes-lab.com/records/lex/ambiguous-api.md), [Boolean Trap](https://banes-lab.com/records/arch/boolean-trap.md)

Referenced by
[Builder Pattern](https://banes-lab.com/records/arch/builder-pattern.md), [Ubiquitous Language](https://banes-lab.com/records/arch/ubiquitous-language.md), [Principle of Least Surprise](https://banes-lab.com/records/arch/principle-of-least-surprise.md)

Tensions
[Intent-Revealing Interface Concise Naming](https://banes-lab.com/records/tension/concise-naming-intent-revealing-interface.md)

Violated by
vague method names, boolean traps

Detected by
generic names, unclear parameters

Measured by
API clarity review findings

Refactored by
Rename Method, Replace Boolean with Enum, Add Value Object

Enforced by
naming lint, API review

Before

```typescript
foo.update("s", "A");
foo.apply(3, true);
```

After

```typescript
foo.activate();
foo.reserve({ quantity: 3, notify: true });
```

### Principle of Least Surprise

- Kind: [principle](https://banes-lab.com/records/kind/principle.md)
- Severity: recommended
- Scope: API, UX, module behavior
- Layer: [Contracts Core](https://banes-lab.com/records/layer/contracts-core.md)

Details

Requires
[Predictability](https://banes-lab.com/records/arch/predictability.md), [Convention](https://banes-lab.com/records/lex/convention.md)

Reinforces
[Stable Interfaces](https://banes-lab.com/records/arch/stable-interfaces.md), [Intent-Revealing Interface](https://banes-lab.com/records/arch/intent-revealing-interface.md)

Enables
[Safe Use](https://banes-lab.com/records/lex/safe-use.md)

In tension with
[Clever Abstractions](https://banes-lab.com/records/lex/clever-abstractions.md)

Conflicts with
[Hidden Side Effects](https://banes-lab.com/records/lex/hidden-side-effects.md)

Referenced by
[Uniform Interface](https://banes-lab.com/records/arch/uniform-interface.md), [Predictability](https://banes-lab.com/records/arch/predictability.md), [Intent-Revealing Interface](https://banes-lab.com/records/arch/intent-revealing-interface.md)

Tensions
[Principle of Least Surprise Clever Abstractions](https://banes-lab.com/records/tension/clever-abstractions-principle-of-least-surprise.md)

Violated by
unexpected mutation, nonstandard behavior

Detected by
misleading names, [hidden behavior](https://banes-lab.com/records/lex/hidden-behavior.md)

Measured by
surprise defects, misuse reports

Refactored by
Rename, Make Side Effects Explicit, Normalize Behavior

Enforced by
API review, [tests](https://banes-lab.com/records/lex/tests.md)

Before

```typescript
function getFoo(id: FooId) {
fooStore.delete(id);
return undefined;
}
```

After

```typescript
function getFoo(id: FooId) { return fooStore.find(id); }
function deleteFoo(id: FooId) { return fooStore.delete(id); }
```

### Database Normalization

- Kind: [technique](https://banes-lab.com/records/kind/technique.md)
- Severity: recommended
- Scope: schema, data modeling, integrity
- Layer: [Contracts Core](https://banes-lab.com/records/layer/contracts-core.md)

Details

Requires
[Functional Dependencies](https://banes-lab.com/records/lex/functional-dependencies.md)

Reinforces
[Single Source of Truth](https://banes-lab.com/records/arch/single-source-of-truth.md), [Data Integrity](https://banes-lab.com/records/lex/data-integrity.md)

Enables
[Update-Anomaly Elimination](https://banes-lab.com/records/lex/update-anomaly-elimination.md), [Non-Redundant Storage](https://banes-lab.com/records/lex/non-redundant-storage.md)

In tension with
[Read Performance](https://banes-lab.com/records/lex/read-performance.md)

Conflicts with
[Duplicated Denormalized Columns](https://banes-lab.com/records/lex/duplicated-denormalized-columns.md)

Tensions
[Database Normalization Read Performance](https://banes-lab.com/records/tension/database-normalization-read-performance.md)

Violated by
repeating groups and transitively-dependent columns duplicated across rows

Detected by
the same fact stored in multiple places drifting out of sync

Measured by
update-anomaly incidents and redundant-column count

Refactored by
Normalize to 3NF, extracting dependent attributes into their own relations

Enforced by
schema review

Before

```typescript
type FooRow = { id: string; customerName: string; customerCity: string; customerCityZip: string };
```

After

```typescript
type Foo = { id: FooId; customerId: CustomerId };
type Customer = { id: CustomerId; name: string; cityId: CityId };
type City = { id: CityId; name: string; zip: string };
```

## Links to

- [mechanism](https://banes-lab.com/records/kind/mechanism.md)
- [Contracts Core](https://banes-lab.com/records/layer/contracts-core.md)
- [Schema Contract](https://banes-lab.com/records/arch/schema-contract.md)
- [Correctness](https://banes-lab.com/records/arch/correctness.md)
- [Data Contract](https://banes-lab.com/records/arch/data-contract.md)
- [Fail Fast](https://banes-lab.com/records/arch/fail-fast.md)
- [Interoperability](https://banes-lab.com/records/arch/interoperability.md)
- [Flexible Input](https://banes-lab.com/records/lex/flexible-input.md)
- [Untyped Payloads](https://banes-lab.com/records/lex/untyped-payloads.md)
- [Declarative Configuration](https://banes-lab.com/records/arch/declarative-configuration.md)
- [Canonical Schema](https://banes-lab.com/records/arch/canonical-schema.md)
- [Schema Validation / Flexible Input](https://banes-lab.com/records/tension/flexible-input-schema-validation.md)
- [Runtime Validation](https://banes-lab.com/records/reason/technique-runtime-validation.md)
- [Explicit Types](https://banes-lab.com/records/lex/explicit-types.md)
- [Contracts](https://banes-lab.com/records/lex/contracts.md)
- [Static Analysis](https://banes-lab.com/records/arch/static-analysis.md)
- [Rapid Scripting](https://banes-lab.com/records/lex/rapid-scripting.md)
- [Dynamic Untyped Boundaries](https://banes-lab.com/records/lex/dynamic-untyped-boundaries.md)
- [Stringly Typed Programming](https://banes-lab.com/records/arch/stringly-typed-programming.md)
- [Explicit Contracts](https://banes-lab.com/records/arch/explicit-contracts.md)
- [Compile-Time Evaluation](https://banes-lab.com/records/arch/compile-time-evaluation.md)
- [Liskov Substitution Principle (LSP)](https://banes-lab.com/records/arch/liskov-substitution.md)
- [Composite Pattern](https://banes-lab.com/records/arch/composite-pattern.md)
- [Type Safety / Rapid Scripting](https://banes-lab.com/records/tension/rapid-scripting-type-safety.md)
- [principle](https://banes-lab.com/records/kind/principle.md)
- [Semantic Consistency](https://banes-lab.com/records/arch/semantic-consistency.md)
- [Ubiquitous Language](https://banes-lab.com/records/arch/ubiquitous-language.md)
- [Single Source of Truth](https://banes-lab.com/records/arch/single-source-of-truth.md)
- [Normalized Translation](https://banes-lab.com/records/lex/normalized-translation.md)
- [Bounded Context Autonomy](https://banes-lab.com/records/lex/bounded-context-autonomy.md)
- [Multiple Competing Models](https://banes-lab.com/records/lex/multiple-competing-models.md)
- [Canonical Data Model](https://banes-lab.com/records/arch/canonical-data-model.md)
- [Canonical Model / Bounded Context Autonomy](https://banes-lab.com/records/tension/bounded-context-autonomy-canonical-model.md)
- [pattern](https://banes-lab.com/records/kind/pattern.md)
- [Canonical Model](https://banes-lab.com/records/arch/canonical-model.md)
- [Normalization](https://banes-lab.com/records/arch/normalization.md)
- [Cross-System Mapping](https://banes-lab.com/records/lex/cross-system-mapping.md)
- [Bounded Context Purity](https://banes-lab.com/records/lex/bounded-context-purity.md)
- [Local Model Autonomy](https://banes-lab.com/records/lex/local-model-autonomy.md)
- [Canonical Data Model / Bounded Context Purity](https://banes-lab.com/records/tension/bounded-context-purity-canonical-data-model.md)
- [Canonical Data Model / Local Model Autonomy](https://banes-lab.com/records/tension/canonical-data-model-local-model-autonomy.md)
- [artifact](https://banes-lab.com/records/kind/artifact.md)
- [Schema Validation](https://banes-lab.com/records/arch/schema-validation.md)
- [Service-Specific Schemas](https://banes-lab.com/records/lex/service-specific-schemas.md)
- [Schema Drift](https://banes-lab.com/records/arch/schema-drift.md)
- [Canonical Schema / Service-Specific Schemas](https://banes-lab.com/records/tension/canonical-schema-service-specific-schemas.md)
- [technique](https://banes-lab.com/records/kind/technique.md)
- [Canonical Format](https://banes-lab.com/records/lex/canonical-format.md)
- [Validation](https://banes-lab.com/records/arch/validation.md)
- [Deduplication](https://banes-lab.com/records/lex/deduplication.md)
- [Idempotency](https://banes-lab.com/records/arch/idempotency.md)
- [Security Checks](https://banes-lab.com/records/lex/security-checks.md)
- [Lossless Preservation](https://banes-lab.com/records/lex/lossless-preservation.md)
- [Ambiguous Encoding](https://banes-lab.com/records/lex/ambiguous-encoding.md)
- [Canonicalization / Lossless Preservation](https://banes-lab.com/records/tension/canonicalization-lossless-preservation.md)
- [Ownership](https://banes-lab.com/records/lex/ownership.md)
- [Canonical Definition](https://banes-lab.com/records/lex/canonical-definition.md)
- [Do Not Repeat Yourself (DRY)](https://banes-lab.com/records/arch/duplicate-code.md)
- [Consistency](https://banes-lab.com/records/arch/consistency.md)
- [Governance](https://banes-lab.com/records/arch/governance.md)
- [Availability](https://banes-lab.com/records/lex/availability.md)
- [Decentralization](https://banes-lab.com/records/arch/decentralization.md)
- [Duplicated Authority](https://banes-lab.com/records/lex/duplicated-authority.md)
- [Magic Value](https://banes-lab.com/records/arch/magic-value.md)
- [Database Normalization](https://banes-lab.com/records/arch/database-normalization.md)
- [Closed Vocabulary](https://banes-lab.com/records/arch/closed-vocabulary.md)
- [Derived Naming Registry](https://banes-lab.com/records/arch/derived-naming-registry.md)
- [Single Source of Truth / Availability](https://banes-lab.com/records/tension/availability-single-source-of-truth.md)
- [Single Source of Truth / Decentralization](https://banes-lab.com/records/tension/decentralization-single-source-of-truth.md)
- [Data Semantics](https://banes-lab.com/records/lex/data-semantics.md)
- [Reduced Redundancy](https://banes-lab.com/records/lex/reduced-redundancy.md)
- [Query Performance](https://banes-lab.com/records/lex/query-performance.md)
- [Denormalized Read Models](https://banes-lab.com/records/lex/denormalized-read-models.md)
- [Normalization / Query Performance](https://banes-lab.com/records/tension/normalization-query-performance.md)
- [Normalization / Denormalized Read Models](https://banes-lab.com/records/tension/denormalized-read-models-normalization.md)
- [quality-attribute](https://banes-lab.com/records/kind/quality-attribute.md)
- [Semantic Contracts](https://banes-lab.com/records/arch/semantic-contracts.md)
- [Disambiguation](https://banes-lab.com/records/lex/disambiguation.md)
- [Polysemy Across Contexts](https://banes-lab.com/records/lex/polysemy-across-contexts.md)
- [Ambiguous Naming](https://banes-lab.com/records/lex/ambiguous-naming.md)
- [Inconsistent Error Model](https://banes-lab.com/records/arch/inconsistent-error-model.md)
- [Domain-Driven Design (DDD)](https://banes-lab.com/records/arch/domain-driven-design.md)
- [Knowledge Graphs](https://banes-lab.com/records/arch/knowledge-graphs.md)
- [Semantic Consistency / Polysemy Across Contexts](https://banes-lab.com/records/tension/polysemy-across-contexts-semantic-consistency.md)
- [activity](https://banes-lab.com/records/kind/activity.md)
- [Domain Collaboration](https://banes-lab.com/records/lex/domain-collaboration.md)
- [Intent-Revealing Interface](https://banes-lab.com/records/arch/intent-revealing-interface.md)
- [Cross-Context Terminology](https://banes-lab.com/records/lex/cross-context-terminology.md)
- [Technical/Domain Mismatch](https://banes-lab.com/records/lex/technical-domain-mismatch.md)
- [Domain Model](https://banes-lab.com/records/arch/domain-model.md)
- [Bounded Context](https://banes-lab.com/records/arch/bounded-context.md)
- [Domain Service](https://banes-lab.com/records/arch/domain-service.md)
- [Domain-Specific Language (DSL)](https://banes-lab.com/records/arch/domain-specific-language.md)
- [Ubiquitous Language / Cross-Context Terminology](https://banes-lab.com/records/tension/cross-context-terminology-ubiquitous-language.md)
- [Clear Semantics](https://banes-lab.com/records/lex/clear-semantics.md)
- [Naming Consistency](https://banes-lab.com/records/lex/naming-consistency.md)
- [Principle of Least Surprise](https://banes-lab.com/records/arch/principle-of-least-surprise.md)
- [Readability](https://banes-lab.com/records/lex/readability.md)
- [Correct Usage](https://banes-lab.com/records/lex/correct-usage.md)
- [Concise Naming](https://banes-lab.com/records/lex/concise-naming.md)
- [Ambiguous API](https://banes-lab.com/records/lex/ambiguous-api.md)
- [Boolean Trap](https://banes-lab.com/records/arch/boolean-trap.md)
- [Builder Pattern](https://banes-lab.com/records/arch/builder-pattern.md)
- [Intent-Revealing Interface / Concise Naming](https://banes-lab.com/records/tension/concise-naming-intent-revealing-interface.md)
- [Predictability](https://banes-lab.com/records/arch/predictability.md)
- [Convention](https://banes-lab.com/records/lex/convention.md)
- [Stable Interfaces](https://banes-lab.com/records/arch/stable-interfaces.md)
- [Safe Use](https://banes-lab.com/records/lex/safe-use.md)
- [Clever Abstractions](https://banes-lab.com/records/lex/clever-abstractions.md)
- [Hidden Side Effects](https://banes-lab.com/records/lex/hidden-side-effects.md)
- [Uniform Interface](https://banes-lab.com/records/arch/uniform-interface.md)
- [Principle of Least Surprise / Clever Abstractions](https://banes-lab.com/records/tension/clever-abstractions-principle-of-least-surprise.md)
- [Hidden Behavior](https://banes-lab.com/records/lex/hidden-behavior.md)
- [Tests](https://banes-lab.com/records/lex/tests.md)
- [Functional Dependencies](https://banes-lab.com/records/lex/functional-dependencies.md)
- [Data Integrity](https://banes-lab.com/records/lex/data-integrity.md)
- [Update-Anomaly Elimination](https://banes-lab.com/records/lex/update-anomaly-elimination.md)
- [Non-Redundant Storage](https://banes-lab.com/records/lex/non-redundant-storage.md)
- [Read Performance](https://banes-lab.com/records/lex/read-performance.md)
- [Duplicated Denormalized Columns](https://banes-lab.com/records/lex/duplicated-denormalized-columns.md)
- [Database Normalization / Read Performance](https://banes-lab.com/records/tension/database-normalization-read-performance.md)

## Linked from

- [The layer topology](https://banes-lab.com/ontology/schema/the-layer-topology.md)
- [The membership](https://banes-lab.com/ontology/schema/the-membership.md)
