Write the Prisma schema for the whole data model and create the migrations. Follow `docs/DATA_MODEL.md` and the search design in `docs/API.md` ("Search without raw SQL"). **Done when:** - [ ] All tables of the data model exist: apparatus (with `position`), element groups, variant groups, elements, vaults, coaches, gymnasts, gymnast element lists, routines and routine items - [ ] The catalog keeps the readable ids from `data/`, and user data gets generated ids (cuid) - [ ] Lists are stored as rows: `routine_elements` (with a position from 1, unique per routine) and `gymnast_elements` (no duplicates per gymnast). Each row points to an element or a vault, and a CHECK makes sure exactly one is set - [ ] Elements and vaults have a nullable `variant_group_id` and `removed_at`. Routines have `created_at` and `updated_at` - [ ] `value` and `d_value` are `Decimal(3, 1)`, with CHECKs on their ranges - [ ] User data cascades on delete, and catalog rows in use cannot be deleted - [ ] The search tables `CatalogEntry` (one row per code) and `CatalogWord` exist, with the indexes for filtering and sorting, and the `C` collation on `catalog_words.word` so the prefix search can use its index - [ ] `prisma migrate dev` reports no changes after the migrations are applied - [ ] `docs/DATA_MODEL.md` describes how the model is stored in PostgreSQL, and agrees with `schema.prisma` on every table and field - [ ] `backend/src/schema.graphql` matches the decisions from the review: the gymnast's element list (`Gymnast.elements`, `addGymnastElement`, `removeGymnastElement`), `removed` on catalog items, and the difficulty filter as a list of values with sorting by difficulty only within an apparatus