Every table carries a site_id. That column is the tenant boundary: queries are always scoped by it, and the API
refuses cross-site reads even when an ID is guessed correctly.
IDs are UUIDs generated on insert. Content additionally has a numeric content_id for humans — the #111 you
see in the list table.
collections (1) ──< content via content.type = collections.name
roles (1) ──< users via users.role = roles.name
media (1) ──< content via content.meta.featured_image
Term attachments live inside content.meta.terms as an array of small objects. That is why renaming a term has to
propagate: the name is copied into every record that references it.