> For the complete documentation index, see [llms.txt](https://lunarie.gitbook.io/lunarie-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lunarie.gitbook.io/lunarie-docs/banco-de-dados/05-relacionamentos.md).

# Relacionamentos

> **Última atualização:** 08/10/2026 Chaves estrangeiras e vínculos entre tabelas, conferidos com o banco em 08/10/2026, incluindo o comportamento na exclusão.

## Chaves estrangeiras entre tabelas do app

| Tabela               | Coluna              | Referencia                 | Ao excluir o pai                                      |
| -------------------- | ------------------- | -------------------------- | ----------------------------------------------------- |
| `ebooks`             | `knowledge_base_id` | `knowledge_base.id`        | `SET NULL`: o livro fica sem vínculo e não é apagado. |
| `kindle_envios`      | `ebook_id`          | `ebooks.id`                | `CASCADE`: o histórico de envios sai com o livro.     |
| `conquistas_obtidas` | `conquista_id`      | `conquistas_definicoes.id` | `CASCADE`                                             |
| `subgeneros_ref`     | `genero_id`         | `generos_ref.id`           | `SET NULL`: o subgênero fica solto.                   |

## Chaves estrangeiras para `auth.users`

Estas colunas apontam para `auth.users(id)` com `ON DELETE CASCADE`: `ebooks.usuario_id`, `profiles.id`, `metas_leitura.usuario_id`, `preferencias_nomenclatura.usuario_id`, `kindle_email_pref.usuario_id`, `conquistas_obtidas.usuario_id`, `ai_usage_logs.usuario_id`, `apoios.usuario_id` e `founders.usuario_id`.

**Sem chave estrangeira:** `kindle_envios.usuario_id` e `series_dismissed_next.usuario_id` guardam o id da pessoa, mas o banco não impõe o vínculo. O isolamento entre pessoas vem da RLS (`auth.uid() = usuario_id`), e a limpeza na exclusão de conta vem da Edge Function.

## Exclusão de conta

A Edge Function `delete-account` não depende só do `CASCADE`. Ela trabalha em ordem explícita (ADR-017):

1. Remove os arquivos dos três buckets, na pasta `{usuario_id}/`.
2. Apaga as linhas por `usuario_id`, inclusive as das tabelas sem FK (`kindle_envios` e `series_dismissed_next`).
3. Anonimiza `apoios` e `founders` com `usuario_id = NULL`, para guardar o histórico financeiro sem identificar a pessoa.
4. Apaga `profiles`.
5. Apaga o usuário no Auth, por último. Aí o `CASCADE` limpa o que sobrou (por exemplo, `ai_usage_logs`).
6. Envia o e-mail de despedida com o CSV da biblioteca (melhor esforço).

## Vínculos com o Storage

O primeiro nível do caminho é sempre o `usuario_id`, e as policies de Storage usam essa convenção para isolar o acesso.

| Coluna                | Destino                                       |
| --------------------- | --------------------------------------------- |
| `ebooks.arquivo_path` | Bucket privado `ebooks` (`{usuario_id}/…`).   |
| `profiles.avatar_url` | Bucket privado `avatares` (`{usuario_id}/…`). |
| `ebooks.capa_url`     | URL pública do bucket `capas` (ADR-011).      |

## Documentos relacionados

* [Tabelas](/lunarie-docs/banco-de-dados/03-tabelas.md)
* [Regras de Dados](/lunarie-docs/banco-de-dados/06-regras-de-dados.md)
* [Segurança](/lunarie-docs/arquitetura/05-seguranca.md)
