Anti-Patterns
Common mistakes to avoid when implementing FERIN-compliant registers. Learn from others' failures.
Why Anti-Patterns Matter
FERIN is deceptively simple. Many implementations fail not because the standard is complex, but because of poor design decisions. Understanding these anti-patterns will help you avoid them.
Content Anti-Patterns
Concept Granularity Too Fine
Problem
Creating a new concept for every minor variation. Example: separate concepts for "Meter (SI)", "Meter (survey)", "Meter (US)".
Consequences
- Concept explosion makes navigation impossible
- Users can't find the right concept
- Maintenance burden becomes unmanageable
Solution
Use concept versions or attributes to capture variations. Only create new concepts when the fundamental meaning differs.
Concept Granularity Too Coarse
Problem
Putting everything in one concept. Example: a single "Unit" concept with a "type" attribute to distinguish length from weight.
Consequences
- Can't model domain-specific properties
- Validation becomes complex
- Relations become meaningless
Solution
Create separate concepts for distinct types. Use inheritance for shared properties.
Using Concept Versions as Concepts
Problem
Creating a new concept version when the meaning has fundamentally changed, instead of creating a new concept.
Consequences
- Version history becomes confusing
- References to old versions become misleading
- Can't properly model supersession
Solution
If the meaning changes, create a new concept with a supersession relation to the old one. Reserve versions for refinements.
Identifier Anti-Patterns
Meaningful Identifiers
Problem
Embedding meaning in identifiers. Example: us-dollar as an identifier.
Consequences
- Can't change the name without breaking references
- What if the meaning changes?
- Identifier becomes misleading over time
Solution
Use opaque identifiers (UUIDs, sequential numbers). Use functional identifiers separately for human-readable codes.
URL-Based Identifiers That Break
Problem
Using URLs tied to specific infrastructure. Example: https://app-v1.internal.company.com/item/123
Consequences
- URLs break when infrastructure changes
- Can't migrate to new domains
- Internal URLs exposed externally
Solution
Use stable, organization-level domains. Implement redirects for backward compatibility when infrastructure changes.
Reusing Identifiers
Problem
Reusing an identifier after content is deleted. "US was deleted, so we can use it for a new United States entry."
Consequences
- Old references now point to wrong content
- Breaks trust in the register
- Audit trails become ambiguous
Solution
Never reuse identifiers. Mark as retired or invalid. Use a new identifier for new content.
Versioning Anti-Patterns
Versioning Everything as Major
Problem
Creating a new version for every minor change, treating all changes as substantive.
Consequences
- Version explosion
- Users can't tell what's significant
- Maintenance complexity
Solution
Distinguish substantive from non-substantive changes. Only version when meaning or compatibility changes.
Modifying In-Place Without History
Problem
Updating content directly without creating change records or preserving previous state.
Consequences
- Lost history
- Can't audit what changed
- Can't rollback
Solution
Always create change records. Implement append-only model for significant content.
Governance Anti-Patterns
Inadequate Role Separation
Problem
One person holding both Manager and Control Body roles in a high-risk register, able to approve their own changes without independent review.
Consequences
- No real accountability
- Potential for abuse
- Regulatory failure
Solution
Match role separation to your register's risk level. For high-risk registers, ensure Control Body independence. For low-risk registers, combined roles are acceptable with documentation. See Risk Management for guidance on assessing your register's risk level.
Governance Theater
Problem
Having governance processes on paper that are routinely bypassed in practice.
Consequences
- Process becomes meaningless
- Real decisions happen elsewhere
- Can't trust documentation
Solution
Either follow your governance or change it to match reality. Inconsistent governance is worse than minimal governance.
Missing Temporal Constraints
Problem
Not tracking when items become valid or expire. Content is just "valid" without time context.
Consequences
- Can't handle planned changes
- Historical queries become impossible
- Transitions are sudden and disruptive
Solution
Track validFrom and validUntil dates. Plan transitions. Support time-travel queries.
Integration Anti-Patterns
Ignoring Cross-Register Dependencies
Problem
Items reference content in other registers without tracking those dependencies.
Consequences
- References break when external content changes
- No notification of upstream changes
- Can't assess impact of changes
Solution
Document external dependencies. Subscribe to notifications from upstream registers. Version your references.