CREATE TABLE "deck_terms" ( "deck_id" uuid NOT NULL, "term_id" uuid NOT NULL, "added_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "deck_terms_deck_id_term_id_pk" PRIMARY KEY("deck_id","term_id") ); --> statement-breakpoint CREATE TABLE "decks" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "name" text NOT NULL, "description" text, "source_language" varchar(10) NOT NULL, "validated_languages" varchar(10)[] DEFAULT '{}' NOT NULL, "is_public" boolean DEFAULT false NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "unique_deck_name" UNIQUE("name","source_language"), CONSTRAINT "source_language_check" CHECK ("decks"."source_language" IN ('en', 'it')), CONSTRAINT "validated_languages_check" CHECK (validated_languages <@ ARRAY['en', 'it']::varchar[]), CONSTRAINT "validated_languages_excludes_source" CHECK (NOT ("decks"."source_language" = ANY("decks"."validated_languages"))) ); --> statement-breakpoint CREATE TABLE "language_pairs" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "source_language" varchar(10) NOT NULL, "target_language" varchar(10) NOT NULL, "label" text, "active" boolean DEFAULT true NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "unique_source_target" UNIQUE("source_language","target_language"), CONSTRAINT "source_language_check" CHECK ("language_pairs"."source_language" IN ('en', 'it')), CONSTRAINT "target_language_check" CHECK ("language_pairs"."target_language" IN ('en', 'it')), CONSTRAINT "no_self_pair" CHECK ("language_pairs"."source_language" != "language_pairs"."target_language") ); --> statement-breakpoint CREATE TABLE "term_glosses" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "term_id" uuid NOT NULL, "language_code" varchar(10) NOT NULL, "text" text NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "unique_term_gloss" UNIQUE("term_id","language_code","text") ); --> statement-breakpoint CREATE TABLE "terms" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "synset_id" text NOT NULL, "pos" varchar(20) NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "terms_synset_id_unique" UNIQUE("synset_id"), CONSTRAINT "pos_check" CHECK ("terms"."pos" IN ('noun')) ); --> statement-breakpoint CREATE TABLE "translations" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "term_id" uuid NOT NULL, "language_code" varchar(10) NOT NULL, "text" text NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "unique_translations" UNIQUE("term_id","language_code","text") ); --> statement-breakpoint CREATE TABLE "users" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "openauth_sub" text NOT NULL, "email" varchar(255), "display_name" varchar(100), "created_at" timestamp with time zone DEFAULT now() NOT NULL, "last_login_at" timestamp with time zone, CONSTRAINT "users_openauth_sub_unique" UNIQUE("openauth_sub"), CONSTRAINT "users_email_unique" UNIQUE("email"), CONSTRAINT "users_display_name_unique" UNIQUE("display_name") ); --> statement-breakpoint ALTER TABLE "deck_terms" ADD CONSTRAINT "deck_terms_deck_id_decks_id_fk" FOREIGN KEY ("deck_id") REFERENCES "public"."decks"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "deck_terms" ADD CONSTRAINT "deck_terms_term_id_terms_id_fk" FOREIGN KEY ("term_id") REFERENCES "public"."terms"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "term_glosses" ADD CONSTRAINT "term_glosses_term_id_terms_id_fk" FOREIGN KEY ("term_id") REFERENCES "public"."terms"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "translations" ADD CONSTRAINT "translations_term_id_terms_id_fk" FOREIGN KEY ("term_id") REFERENCES "public"."terms"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint CREATE INDEX "idx_deck_terms_term" ON "deck_terms" USING btree ("term_id");--> statement-breakpoint CREATE INDEX "idx_pairs_active" ON "language_pairs" USING btree ("active","source_language","target_language");--> statement-breakpoint CREATE INDEX "idx_term_glosses_term" ON "term_glosses" USING btree ("term_id");--> statement-breakpoint CREATE INDEX "idx_terms_pos" ON "terms" USING btree ("pos");--> statement-breakpoint CREATE INDEX "idx_translations_lang" ON "translations" USING btree ("language_code","term_id");