mirror of
https://github.com/BillyOutlast/posthog.git
synced 2026-02-04 03:01:23 +01:00
133 lines
4.6 KiB
SQL
133 lines
4.6 KiB
SQL
-- Persons DB schema for test harness with secondary DB (secondary DB used by dual-write)
|
|
-- Minimal compatible DDL for PostgresPersonRepository operations for testing
|
|
|
|
CREATE TABLE IF NOT EXISTS posthog_person (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
uuid UUID NOT NULL UNIQUE,
|
|
created_at TIMESTAMPTZ NOT NULL,
|
|
team_id INTEGER NOT NULL,
|
|
properties JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
properties_last_updated_at JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
properties_last_operation JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
is_user_id INTEGER NULL,
|
|
is_identified BOOLEAN NOT NULL DEFAULT false,
|
|
version BIGINT NULL
|
|
);
|
|
|
|
-- Helpful index for updatePersonAssertVersion
|
|
CREATE INDEX IF NOT EXISTS posthog_person_team_uuid_idx
|
|
ON posthog_person (team_id, uuid);
|
|
|
|
-- Distinct IDs
|
|
CREATE TABLE IF NOT EXISTS posthog_persondistinctid (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
distinct_id VARCHAR(400) NOT NULL,
|
|
person_id BIGINT NOT NULL,
|
|
team_id INTEGER NOT NULL,
|
|
version BIGINT NULL
|
|
);
|
|
|
|
-- Add both foreign key constraints to match production schema
|
|
-- The deferred constraint needs CASCADE for delete operations to work
|
|
-- Drop constraints if they exist first to ensure clean state
|
|
DO $$
|
|
BEGIN
|
|
ALTER TABLE posthog_persondistinctid
|
|
DROP CONSTRAINT IF EXISTS posthog_persondistin_person_id_5d655bba_fk_posthog_p;
|
|
ALTER TABLE posthog_persondistinctid
|
|
DROP CONSTRAINT IF EXISTS posthog_persondistinctid_person_id_5d655bba_fk;
|
|
|
|
ALTER TABLE posthog_persondistinctid
|
|
ADD CONSTRAINT posthog_persondistin_person_id_5d655bba_fk_posthog_p
|
|
FOREIGN KEY (person_id)
|
|
REFERENCES posthog_person(id)
|
|
ON DELETE CASCADE
|
|
DEFERRABLE INITIALLY DEFERRED;
|
|
|
|
ALTER TABLE posthog_persondistinctid
|
|
ADD CONSTRAINT posthog_persondistinctid_person_id_5d655bba_fk
|
|
FOREIGN KEY (person_id)
|
|
REFERENCES posthog_person(id)
|
|
ON DELETE CASCADE;
|
|
END $$;
|
|
|
|
-- Create the unique constraint (not just index) to match production
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM pg_constraint
|
|
WHERE conname = 'unique distinct_id for team'
|
|
AND conrelid = 'posthog_persondistinctid'::regclass
|
|
) THEN
|
|
ALTER TABLE posthog_persondistinctid
|
|
ADD CONSTRAINT "unique distinct_id for team"
|
|
UNIQUE (team_id, distinct_id);
|
|
END IF;
|
|
END $$;
|
|
|
|
CREATE INDEX IF NOT EXISTS posthog_persondistinctid_person_id_5d655bba
|
|
ON posthog_persondistinctid (person_id);
|
|
|
|
-- Personless distinct IDs (merge queue helpers)
|
|
CREATE TABLE IF NOT EXISTS posthog_personlessdistinctid (
|
|
team_id INTEGER NOT NULL,
|
|
distinct_id TEXT NOT NULL,
|
|
is_merged BOOLEAN NOT NULL DEFAULT false,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
PRIMARY KEY (team_id, distinct_id)
|
|
);
|
|
|
|
-- Cohort membership by person (only person_id is touched by repo)
|
|
CREATE TABLE IF NOT EXISTS posthog_cohortpeople (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
cohort_id INTEGER NOT NULL,
|
|
person_id BIGINT NOT NULL,
|
|
version INTEGER NULL
|
|
);
|
|
|
|
-- Add both foreign key constraints to match production schema
|
|
ALTER TABLE posthog_cohortpeople
|
|
ADD CONSTRAINT posthog_cohortpeople_person_id_33da7d3f_fk_posthog_person_id
|
|
FOREIGN KEY (person_id)
|
|
REFERENCES posthog_person(id)
|
|
ON DELETE CASCADE
|
|
DEFERRABLE INITIALLY DEFERRED;
|
|
|
|
ALTER TABLE posthog_cohortpeople
|
|
ADD CONSTRAINT posthog_cohortpeople_person_id_33da7d3f_fk
|
|
FOREIGN KEY (person_id)
|
|
REFERENCES posthog_person(id)
|
|
ON DELETE CASCADE;
|
|
|
|
CREATE INDEX IF NOT EXISTS posthog_cohortpeople_person_id_33da7d3f
|
|
ON posthog_cohortpeople (person_id);
|
|
|
|
-- Index from Django model Meta class
|
|
CREATE INDEX IF NOT EXISTS posthog_cohortpeople_cohort_person_idx
|
|
ON posthog_cohortpeople (cohort_id, person_id);
|
|
|
|
-- Feature flag hash key overrides (referenced during person merges)
|
|
CREATE TABLE IF NOT EXISTS posthog_featureflaghashkeyoverride (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
team_id INTEGER NOT NULL,
|
|
person_id BIGINT NOT NULL,
|
|
feature_flag_key TEXT NOT NULL,
|
|
hash_key TEXT NOT NULL
|
|
);
|
|
|
|
-- Add both foreign key constraints to match production schema
|
|
ALTER TABLE posthog_featureflaghashkeyoverride
|
|
ADD CONSTRAINT posthog_featureflagh_person_id_7e517f7c_fk_posthog_p
|
|
FOREIGN KEY (person_id)
|
|
REFERENCES posthog_person(id)
|
|
ON DELETE CASCADE
|
|
DEFERRABLE INITIALLY DEFERRED;
|
|
|
|
ALTER TABLE posthog_featureflaghashkeyoverride
|
|
ADD CONSTRAINT posthog_featureflaghashkeyoverride_person_id_7e517f7c_fk
|
|
FOREIGN KEY (person_id)
|
|
REFERENCES posthog_person(id)
|
|
ON DELETE CASCADE;
|
|
|
|
CREATE INDEX IF NOT EXISTS posthog_featureflaghashkeyoverride_person_id_7e517f7c
|
|
ON posthog_featureflaghashkeyoverride (person_id); |