# 10.4 - Construindo a Base — Tabelas, Colunas e Linhas

Já decidimos que nosso QG Supabase vai usar o estilo **Relacional**, aquele das tabelas organizadinhas, tipo planilhas superpoderosas. Agora, vamos aprender a construir a *estrutura* dessas tabelas.

Pensa que estamos projetando uma casa. Antes de sair levantando parede, a gente precisa definir os cômodos (quartos, sala, cozinha) e o que vai ter dentro de cada um, certo?

No mundo dos bancos de dados, é parecido. Precisamos definir:

1. **Quais "coisas" queremos guardar?** (As Entidades)
2. **Quais características dessas "coisas" são importantes?** (Os Atributos)

Depois, transformamos isso na estrutura do nosso banco:

3. **Onde guardamos cada tipo de "coisa"?** (As Tabelas)
4. **Como chamamos cada característica na tabela?** (As Colunas/Campos)
5. **Como chamamos cada "coisa" individual guardada?** (As Linhas/Registros)

Vamos desvendar cada um desses!

### Entidades: As "Coisas" do Nosso Mundo 🌍 <a href="#entidades-as-andquotcoisasandquot-do-nosso-mundo" id="entidades-as-andquotcoisasandquot-do-nosso-mundo"></a>

**Entidade** é qualquer objeto, conceito ou evento do mundo real sobre o qual queremos guardar informações. Geralmente, é um substantivo.

Pensa no projeto que você quer criar:

* **Mini Rede Social:** Quais são as "coisas" importantes? `Usuarios`, `Posts`, `Comentarios`, `Likes`...
* **Catálogo de Jogos:** `Jogos`, `Plataformas` (PC, PS5, Xbox), `Generos` (Ação, RPG), `Avaliacoes`...
* **Lista de Tarefas:** `Tarefas`, `Usuarios`, `Categorias`...

Cada uma dessas "coisas" é uma **Entidade**. É o assunto principal que vamos armazenar.

### Atributos: As Características das "Coisas" 🏷️ <a href="#atributos-as-caracteristicas-das-andquotcoisasandquot" id="atributos-as-caracteristicas-das-andquotcoisasandquot"></a>

Beleza, já sabemos *o que* queremos guardar (as Entidades). Agora, *quais informações* sobre cada uma delas são relevantes? Essas características são os **Atributos**.

Vamos pegar a entidade `Usuario` de uma rede social:

* Quais atributos um usuário tem? `Nome`, `Email`, `Senha` (criptografada, claro!), `DataDeNascimento`, `FotoDePerfil` (o link pra ela), `NumeroDeSeguidores`...

E a entidade `Post`?

* `TextoDoPost`, `DataDePublicacao`, `UsuarioQuePostou` (aqui tem uma conexão!), `NumeroDeLikes`...

E a entidade `Jogo`?

* `Titulo`, `AnoDeLancamento`, `Genero`, `Plataforma`, `Descricao`, `CapaDoJogo`...

Os atributos são os detalhes que descrevem cada entidade.

### Tabelas: As "Planilhas" do Banco de Dados 📊 <a href="#tabelas-as-andquotplanilhasandquot-do-banco-de-dados" id="tabelas-as-andquotplanilhasandquot-do-banco-de-dados"></a>

Agora sim, vamos pro banco de dados! Cada **Entidade** que definimos geralmente vira uma **Tabela** no nosso banco Supabase (PostgreSQL).

A Tabela é a estrutura onde vamos organizar os dados de um tipo específico de entidade.

* Entidade `Usuario` -> Tabela `usuarios`
* Entidade `Post` -> Tabela `posts`
* Entidade `Jogo` -> Tabela `jogos`

(Usamos nomes no plural e em minúsculo por convenção, fica mais organizado!)

Dentro do Supabase, você vai usar o **Table Editor** pra criar essas tabelas.

### Colunas (Campos): As Características na Tabela 🏷️➡️📊 <a href="#colunas-campos-as-caracteristicas-na-tabela" id="colunas-campos-as-caracteristicas-na-tabela"></a>

E os **Atributos**? Eles viram as **Colunas** (ou Campos) da nossa tabela!

Se a entidade `Usuario` tem os atributos `Nome`, `Email` e `DataDeNascimento`, a tabela `usuarios` vai ter as colunas `nome`, `email` e `data_nascimento`.

| id (PK) | nome        | email                    | data\_nascimento |
| ------- | ----------- | ------------------------ | ---------------- |
| 1       | João Silva  | <joao.silva@email.com>   | 2006-05-10       |
| 2       | Maria Souza | <maria.s@outroemail.com> | 2007-11-22       |
| ...     | ...         | ...                      | ...              |

Cada coluna guarda um tipo específico de informação sobre a entidade.

### Linhas (Registros): Cada "Coisa" Guardada 📝 <a href="#linhas-registros-cada-andquotcoisaandquot-guardada" id="linhas-registros-cada-andquotcoisaandquot-guardada"></a>

E cada "coisa" individual que a gente guarda na tabela? Cada usuário específico, cada post específico, cada jogo específico? Isso é uma **Linha** (ou Registro).

Na tabela `usuarios` acima:

* A primeira linha representa o usuário "João Silva".
* A segunda linha representa a usuária "Maria Souza".

Cada linha contém os valores dos atributos (colunas) para aquela instância específica da entidade.

### Tipos de Dados: Que Tipo de Info Cabe Aqui? 🤔🔢🔤📅✅ <a href="#tipos-de-dados-que-tipo-de-info-cabe-aqui" id="tipos-de-dados-que-tipo-de-info-cabe-aqui"></a>

Muito importante! Quando criamos uma coluna na nossa tabela, precisamos dizer pro banco de dados **que tipo de informação** ele pode guardar ali. Isso ajuda a manter a organização e a evitar erros (tipo guardar um texto onde deveria ter um número).

Esses são os **Tipos de Dados**. Os mais comuns que vamos usar no Supabase (PostgreSQL) são:

* **Texto:**
  * `text`: Para textos de tamanho variável, sem limite prático (bom pra descrições longas, posts).
  * `varchar(n)`: Para textos com um limite máximo de `n` caracteres (bom pra nomes, emails, títulos curtos). Ex: `varchar(100)` guarda até 100 caracteres.
* **Números:**
  * `int` ou `integer`: Para números inteiros (sem casas decimais), como idade, quantidade, IDs. Ex: `10`, `-5`, `1500`.
  * `bigint`: Para inteiros MUITO grandes.
  * `numeric(p, s)` ou `decimal(p, s)`: Para números com casas decimais, como preço, notas. `p` é o total de dígitos e `s` é quantos ficam depois da vírgula. Ex: `numeric(10, 2)` guarda um número como `12345678.99`.
  * `real` ou `float`: Para números decimais com precisão aproximada (menos usado para dinheiro, mas comum em cálculos científicos).
* **Datas e Horas:**
  * `date`: Guarda só a data (Ano-Mês-Dia). Ex: `2025-06-03`.
  * `time`: Guarda só a hora (Hora:Minuto:Segundo). Ex: `14:30:00`.
  * `timestamp` ou `timestamptz`: Guarda data E hora juntos. O `timestamptz` (com timezone) é geralmente o mais recomendado no Supabase, pois ele lida bem com fusos horários diferentes. Ex: `2025-06-03 14:30:00+00`.
* **Lógico (Booleano):**
  * `boolean`: Guarda apenas dois valores: `true` (verdadeiro) ou `false` (falso). Perfeito para marcar coisas como `tarefa_concluida`, `usuario_ativo`, `post_publicado`.
* **Identificador Único:**
  * `uuid`: Um identificador único universal. O Supabase gosta de usar `uuid` como chave primária (veremos no próximo capítulo!) porque é super difícil de repetir, mesmo entre tabelas diferentes.

**Por que isso importa?**

1. **Organização:** Garante que cada coluna tenha o tipo certo de dado.
2. **Validação:** O banco não deixa você colocar "batata" numa coluna de número.
3. **Eficiência:** O banco sabe como guardar e buscar cada tipo de dado da forma mais rápida.
4. **Cálculos Corretos:** Você só pode somar números com números, não números com texto.

Quando você for criar suas colunas no Table Editor do Supabase, você vai escolher um desses tipos!

Ufa! Bastante coisa, né? Mas agora você já sabe como pensar na estrutura do seu banco:

1. Defina as **Entidades** (as coisas).
2. Liste os **Atributos** (as características) de cada entidade.
3. Crie as **Tabelas** (uma pra cada entidade).
4. Defina as **Colunas** (uma pra cada atributo), escolhendo o **Tipo de Dado** correto.
5. As **Linhas** serão os dados que você vai inserir depois!

No próximo capítulo, vamos falar das **Chaves Mestras** (Primária e Estrangeira), que são essenciais pra identificar unicamente cada linha e pra conectar nossas tabelas. Bora lá descobrir esses segredos?
