-- B05分支只保存起点;正文内容仍归既有document/version表。 CREATE TABLE public.muse_document_branch ( document_id uuid PRIMARY KEY REFERENCES public.muse_document(document_id), source_document_id uuid NOT NULL, source_revision bigint NOT NULL, source_hash text NOT NULL, author_id text NOT NULL, created_at timestamptz NOT NULL DEFAULT clock_timestamp(), CHECK(document_id <> source_document_id), FOREIGN KEY(source_document_id,source_revision) REFERENCES public.muse_document_version(document_id,revision) ); CREATE TABLE public.muse_branch_merge_source ( candidate_id uuid NOT NULL, candidate_revision bigint NOT NULL, source_document_id uuid NOT NULL REFERENCES public.muse_document_branch(document_id), source_revision bigint NOT NULL, source_hash text NOT NULL, merge_basis jsonb NOT NULL, PRIMARY KEY(candidate_id,candidate_revision), FOREIGN KEY(candidate_id,candidate_revision) REFERENCES public.muse_writing_candidate_version(candidate_id,revision), FOREIGN KEY(source_document_id,source_revision) REFERENCES public.muse_document_version(document_id,revision) ); CREATE FUNCTION public.muse_branch_source_immutable() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN RAISE EXCEPTION 'branch and merge origins are immutable'; END; $$; CREATE TRIGGER document_branch_immutable BEFORE UPDATE OR DELETE ON public.muse_document_branch FOR EACH ROW EXECUTE FUNCTION public.muse_branch_source_immutable(); CREATE TRIGGER branch_merge_source_immutable BEFORE UPDATE OR DELETE ON public.muse_branch_merge_source FOR EACH ROW EXECUTE FUNCTION public.muse_branch_source_immutable();