Skip to content

[Feature] Add CHECK constraints and unique constraints to database schema #186

@d-oit

Description

@d-oit

Description

The SQLite schema lacks important constraints that would ensure data integrity at the database level:

  1. No CHECK constraint on claims.confidence to enforce 0 <= confidence <= 1
  2. No CHECK constraint on claims.verification_status to enforce valid enum values
  3. No UNIQUE constraint on entities.name — duplicate entity names are possible
  4. No indexes on frequently queried columns (claims.verification_status, notes.entity_id, web_cache.resolved_at)

Current Schema Gaps

-- Missing: CHECK (confidence BETWEEN 0 AND 1)
confidence REAL NOT NULL,

-- Missing: CHECK (verification_status IN ('unverified', 'verified', 'disputed'))
verification_status TEXT NOT NULL DEFAULT 'unverified',

-- Missing: UNIQUE constraint
name TEXT NOT NULL,

Proposed Changes

-- Add CHECK constraints
confidence REAL NOT NULL CHECK (confidence >= 0 AND confidence <= 1),
verification_status TEXT NOT NULL DEFAULT 'unverified' 
  CHECK (verification_status IN ('unverified', 'verified', 'disputed')),

-- Add unique constraint
name TEXT NOT NULL UNIQUE,

-- Add missing indexes
CREATE INDEX idx_claims_verification_status ON claims(verification_status);
CREATE INDEX idx_notes_entity_id ON notes(entity_id);
CREATE INDEX idx_web_cache_resolved_at ON web_cache(resolved_at);

Acceptance Criteria

  • confidence has CHECK constraint
  • verification_status has CHECK constraint
  • entities.name has UNIQUE constraint
  • Missing indexes created
  • Existing tests still pass
  • Zod schemas match database constraints

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: backendBackend/data layerduplicateThis issue or pull request already existsimprovementImprovement to existing featurepriority: mediumMedium priority

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions