WordloopWordloop
WorkDeliveredLive CaptureTechnical DesignSchemasCore

PostgreSQL Schema

Relational database schema for the Core service.

PostgreSQL Schema

Target state of every table involved in this bet after all migrations are applied.

meetings

CREATE TABLE meetings (
    id               UUID        NOT NULL DEFAULT uuidv7(),
    user_id          UUID        NOT NULL,
    title            TEXT        NOT NULL,
    headline         TEXT,                          -- ML-generated one-line summary
    source_type      TEXT        NOT NULL,
    start_time       TIMESTAMPTZ NOT NULL,
    end_time         TIMESTAMPTZ,
    summary          TEXT,
    key_points       JSONB,
    created_at       TIMESTAMPTZ NOT NULL DEFAULT now(),
    deleted_at       TIMESTAMPTZ,

    CONSTRAINT pk_meetings               PRIMARY KEY (id),
    CONSTRAINT fk_meetings_user          FOREIGN KEY (user_id)
        REFERENCES users (id) ON DELETE CASCADE,
    CONSTRAINT chk_meetings_source_type  CHECK (source_type IN ('recording', 'upload', 'text', 'anecdotal')),
    CONSTRAINT chk_meetings_timeline     CHECK (end_time IS NULL OR end_time > start_time)
);

meeting_audio_files

CREATE TABLE meeting_audio_files (
    meeting_id       UUID        NOT NULL,
    gcs_path         TEXT,
    status           TEXT        NOT NULL,
    created_at       TIMESTAMPTZ NOT NULL DEFAULT now(),
    updated_at       TIMESTAMPTZ NOT NULL DEFAULT now(),

    CONSTRAINT pk_meeting_audio_files    PRIMARY KEY (meeting_id),
    CONSTRAINT fk_meeting_audio_meeting  FOREIGN KEY (meeting_id)
        REFERENCES meetings (id) ON DELETE CASCADE,
    CONSTRAINT chk_meeting_audio_status  CHECK (
        status IN ('recording', 'processing', 'completed', 'failed')
    ),
    CONSTRAINT chk_meeting_audio_path    CHECK (
        status IN ('processing', 'failed') OR gcs_path IS NOT NULL
    )
);

transcript_segments

CREATE TABLE transcript_segments (
    id               UUID        NOT NULL DEFAULT uuidv7(),
    transcription_id UUID        NOT NULL,
    speaker_label    TEXT,
    person_id        UUID,
    text             TEXT        NOT NULL,
    start_ms         BIGINT      NOT NULL,
    end_ms           BIGINT      NOT NULL,
    confidence       REAL,
    is_final         BOOLEAN     NOT NULL DEFAULT false,
    is_highlighted   BOOLEAN     NOT NULL DEFAULT false,
    feature_vector   vector(512),
    created_at       TIMESTAMPTZ NOT NULL DEFAULT now(),

    CONSTRAINT pk_transcript_segments    PRIMARY KEY (id),
    CONSTRAINT fk_segments_transcription FOREIGN KEY (transcription_id)
        REFERENCES transcriptions (id) ON DELETE CASCADE,
    CONSTRAINT fk_segments_person        FOREIGN KEY (person_id)
        REFERENCES people (id) ON DELETE SET NULL,
    CONSTRAINT chk_segments_timeline     CHECK (end_ms > start_ms),
    CONSTRAINT chk_segments_confidence   CHECK (confidence IS NULL OR (confidence >= 0 AND confidence <= 1))
);

talking_points

CREATE TABLE talking_points (
    id         UUID        NOT NULL DEFAULT uuidv7(),
    meeting_id UUID        NOT NULL,
    topic_id   UUID,
    content    TEXT        NOT NULL,
    is_final   BOOLEAN     NOT NULL DEFAULT false,
    created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
    deleted_at TIMESTAMPTZ,

    CONSTRAINT pk_talking_points         PRIMARY KEY (id),
    CONSTRAINT fk_talking_points_meeting FOREIGN KEY (meeting_id)
        REFERENCES meetings (id) ON DELETE CASCADE,
    CONSTRAINT fk_talking_points_topic   FOREIGN KEY (topic_id)
        REFERENCES topics (id) ON DELETE SET NULL
);

On this page