📄 Documentação SQL – Estrutura Detalhada da Loja Online

Um guia completo para entender o banco de dados da nossa plataforma de e-commerce.

6 Tabelas

Estruturas fundamentais dos dados.

7 Views

Consultas pré-definidas para insights.

0 Triggers

Ações automatizadas no banco de dados.


1. Tabela usuarios

CREATE TABLE public.usuarios (
  id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  nome TEXT,
  email TEXT NOT NULL UNIQUE,
  senha TEXT NOT NULL,
  telefone TEXT,
  avatar_url TEXT,
  papel TEXT,
  empresa_ref BIGINT,
  user_id UUID REFERENCES auth.users(id),
  created_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
  CONSTRAINT usuarios_empresa_ref_fkey FOREIGN KEY (empresa_ref) REFERENCES empresa (id)
);

2. Tabela produtos

CREATE TABLE public.produtos (
  id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  nome TEXT NOT NULL,
  descricao TEXT,
  preco NUMERIC(10,2),
  categoria TEXT,
  imagem_principal TEXT,
  link_afiliado TEXT,
  tipo TEXT DEFAULT 'proprio',
  ativo BOOLEAN DEFAULT TRUE,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT now()
);

3. Tabela fotos_produtos

CREATE TABLE public.fotos_produtos (
  id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  produto_id BIGINT NOT NULL REFERENCES produtos(id) ON DELETE CASCADE,
  url TEXT NOT NULL
);

4. Tabela avaliacoes

CREATE TABLE public.avaliacoes (
  id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  produto_id BIGINT NOT NULL REFERENCES produtos(id) ON DELETE CASCADE,
  usuario_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
  nota INTEGER CHECK (nota >= 1 AND nota <= 5),
  comentario TEXT,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
  UNIQUE (produto_id, usuario_id)
);

5. Tabela pedidos

CREATE TABLE pedidos (
  id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  usuario_id UUID REFERENCES auth.users(id),
  status TEXT DEFAULT 'pendente',
  total NUMERIC(10,2),
  created_at TIMESTAMP WITH TIME ZONE DEFAULT now()
);

6. Tabela itens_pedido

CREATE TABLE itens_pedido (
  id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  pedido_id BIGINT REFERENCES pedidos(id) ON DELETE CASCADE,
  produto_id BIGINT REFERENCES produtos(id),
  quantidade INTEGER,
  preco_unitario NUMERIC(10,2)
);

7. View vw_media_avaliacoes

CREATE VIEW vw_media_avaliacoes AS
SELECT
  p.id AS produto_id,
  p.nome,
  COUNT(a.id) AS total_avaliacoes,
  ROUND(AVG(a.nota)::numeric, 2) AS media_estrela
FROM produtos p
LEFT JOIN avaliacoes a ON a.produto_id = p.id
GROUP BY p.id, p.nome;

8. View vw_total_usuarios

CREATE VIEW vw_total_usuarios AS
SELECT COUNT(*) AS total_usuarios FROM usuarios;

9. View vw_total_produtos

CREATE VIEW vw_total_produtos AS
SELECT COUNT(*) AS total_produtos FROM produtos;

10. View vw_total_produtos_por_categoria

CREATE VIEW vw_total_produtos_por_categoria AS
SELECT categoria, COUNT(*) AS total FROM produtos GROUP BY categoria;

11. View vw_total_produtos_novos

CREATE VIEW vw_total_produtos_novos AS
SELECT COUNT(*) AS total_novos FROM produtos WHERE tipo = 'novo';

12. View vw_total_produtos_usados

CREATE VIEW vw_total_produtos_usados AS
SELECT COUNT(*) AS total_usados FROM produtos WHERE tipo = 'usado';

13. View vw_total_produtos_vendidos

CREATE VIEW vw_total_produtos_vendidos AS
SELECT SUM(quantidade) AS total_vendidos FROM itens_pedido;

🎯 Testes de Inserção e Limpeza

-- Inserts de teste
-- Usuário de exemplo
INSERT INTO usuarios (nome, email, senha, telefone, avatar_url, papel)
VALUES
  ('João Admin', 'admin@teste.com', 'senha123', '69999999999', 'https://exemplo.com/avatar1.png', 'admin'),
  ('Maria Usuária', 'maria@teste.com', 'senha456', '69999999988', 'https://exemplo.com/avatar2.png', 'user');

-- Produtos de exemplo
INSERT INTO produtos (nome, descricao, preco, categoria, imagem_principal, tipo)
VALUES
  ('Fone de Ouvido', 'Fone com Bluetooth e som limpo', 199.99, 'Eletrônicos', 'https://exemplo.com/fone.jpg', 'novo'),
  ('Notebook Usado', 'Notebook semi-novo com SSD', 2499.90, 'Informática', 'https://exemplo.com/notebook.jpg', 'usado');

-- Fotos dos produtos
INSERT INTO fotos_produtos (produto_id, url)
VALUES
  (1, 'https://exemplo.com/fone1.jpg'),
  (1, 'https://exemplo.com/fone2.jpg'),
  (2, 'https://exemplo.com/notebook1.jpg');

-- Avaliações
INSERT INTO avaliacoes (produto_id, usuario_id, nota, comentario)
VALUES
  (1, '00000000-0000-0000-0000-000000000000', 5, 'Produto ótimo!'),
  (2, '00000000-0000-0000-0000-000000000000', 4, 'Bom custo-benefício.');

-- Pedidos
INSERT INTO pedidos (usuario_id, status, total)
VALUES
  ('00000000-0000-0000-0000-000000000000', 'pago', 199.99);

-- Itens do pedido
INSERT INTO itens_pedido (pedido_id, produto_id, quantidade, preco_unitario)
VALUES
  (1, 1, 1, 199.99);

-- Limpar dados de teste (DELETE)
-- ATENÇÃO: Use com cuidado em ambiente real
-- DELETE FROM itens_pedido;
-- DELETE FROM pedidos;
-- DELETE FROM avaliacoes;
-- DELETE FROM fotos_produtos;
-- DELETE FROM produtos;
-- DELETE FROM usuarios;