Skip to content

Latest commit

 

History

History
201 lines (154 loc) · 7.17 KB

File metadata and controls

201 lines (154 loc) · 7.17 KB

Status: em desenvolvimento Stack: MySQL Domínio: Imobiliária SaaS: modelagem

💼 Imobiliaria — Modelagem de Banco para SaaS

Objetivo: disponibilizar uma modelagem inicial de banco de dados para um sistema SaaS de imobiliárias. O foco é oferecer um ponto de partida limpo e didático para evoluir em normalização, multitenancy e governança de dados.

  • 📂 Esquema principal: sql/01_schema.sql
  • 🧭 Status: inicial, em evolução (multitenancy em roadmap)
  • 🧪 Ideal para: estudos, POCs e bases de TCC/portfólio

📑 Sumário


🔎 Visão Geral

Este repositório oferece um esquema SQL para o domínio imobiliário (aluguel/venda, contratos, partes envolvidas, etc.), com foco em simplicidade e extensibilidade.

Entidades centrais do domínio (nomes podem variar conforme a evolução do schema):

  • profissoes, tipo_endereco, endereco, contato, pessoa
  • Regiao, Estado, Municipio, Bairro
  • contrutora, finalidade_busca, tipo_imovel, localizacao
  • Tabelas de apoio/segurança: perm_system, acesso_tipo, acessos, pessoa_has_identifica, identifica
  • (Futuro) tenant para isolamento lógico multi-empresa

Para visualizar o modelo, importe o .sql em ferramentas como DBeaver, MySQL Workbench ou gere um ERD via dbdiagram.io. Diagramas estáticos podem ser adicionados em docs/erd.


🧭 Estrutura e Padrões

  • Banco/SGBD: MySQL 8+
  • Charset/Collation: utf8mb4 / utf8mb4_unicode_ci
  • Convenções
    • Tabelas/colunas em snake_case
    • PKs inteiras autoincrement (INT + AUTO_INCREMENT), FKs obrigatórias
    • Campos de auditoria (sugeridos): created_at, updated_at (ainda não implementados)
    • Soft delete (opcional): deleted_at
  • Índices otimizados para joins e consultas frequentes (ver sql/indexes.sql)
  • Seeds para popular dados mínimos (ver sql/seed.sql)

⚙️ Como Executar

Os arquivos ficam no diretório sql/:

  • sql/01_schema.sql — DDL
  • 02_seed_minimo.sql — dados iniciais
  • 03_indexes.sql — índices adicionais

Opção A — Docker Compose (recomendado)

# 1) Subir serviços
docker compose up -d

# 2) (Opcional) Acompanhar logs
docker compose logs -f mysql

# 3) Importar schema + seeds + índices
docker exec -i mysql \
  sh -c 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -h127.0.0.1' < sql/01_schema.sql.sql

docker exec -i mysql \
  sh -c 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -h127.0.0.1 01_schema.sql' < sql/02_seed_minimo.sql

docker exec -i mysql \
  sh -c 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -h127.0.0.1 01_schema.sql' < sql/03_indexes.sql

O workflow de CI usa 127.0.0.1 para conexão MySQL (compatibilidade com GitHub Actions).

Opção B — MySQL local

# 1) Criar banco com charset/collation recomendados
mysql -u root -p -e "CREATE DATABASE 01_schema.sql CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

# 2) Importar schema, seed e índices
mysql -u root -p bd_imobiliaria < sql/01_schema.sql.sql
mysql -u root -p bd_imobiliaria < sql/02_seed_minimo.sql
mysql -u root -p bd_imobiliaria < sql/03_indexes.sql

Verificação rápida

-- Tabelas essenciais com ao menos 1 linha?
SELECT 'Regiao' AS tabela, COUNT(*) AS qtd FROM Regiao
UNION ALL SELECT 'Estado', COUNT(*) FROM Estado
UNION ALL SELECT 'Municipio', COUNT(*) FROM Municipio
UNION ALL SELECT 'tipo_endereco', COUNT(*) FROM tipo_endereco
UNION ALL SELECT 'endereco', COUNT(*) FROM endereco
UNION ALL SELECT 'profissoes', COUNT(*) FROM profissoes
UNION ALL SELECT 'contato', COUNT(*) FROM contato
UNION ALL SELECT 'pessoa', COUNT(*) FROM pessoa
UNION ALL SELECT 'construtora', COUNT(*) FROM contrutora
UNION ALL SELECT 'finalidade_busca', COUNT(*) FROM finalidade_busca
UNION ALL SELECT 'tipo_imovel', COUNT(*) FROM tipo_imovel
UNION ALL SELECT 'localizacao', COUNT(*) FROM localizacao;

🔍 Consultas de Exemplo

Ajuste nomes de colunas conforme seu client/visões.

Contratos ativos por período (exemplo conceitual)

SELECT c.id, c.data_inicio, c.data_fim, l.nome AS locatario, i.codigo AS imovel
FROM contrato c
JOIN locatario l ON l.id = c.locatario_id
JOIN imovel i    ON i.id = c.imovel_id
WHERE c.data_inicio <= CURRENT_DATE
  AND (c.data_fim IS NULL OR c.data_fim >= CURRENT_DATE);

Inadimplência (pagamentos em atraso) — conceitual

SELECT p.id, p.vencimento, p.valor, l.nome AS locatario
FROM pagamento p
JOIN contrato c ON c.id = p.contrato_id
JOIN locatario l ON l.id = c.locatario_id
WHERE p.status = 'EM_ABERTO'
  AND p.vencimento < CURRENT_DATE;

Vacância de imóveis (sem contrato ativo) — conceitual

SELECT i.id, i.codigo, i.tipo, i.cidade
FROM imovel i
LEFT JOIN contrato c
  ON c.imovel_id = i.id
 AND c.data_inicio <= CURRENT_DATE
 AND (c.data_fim IS NULL OR c.data_fim >= CURRENT_DATE)
WHERE c.id IS NULL;

🗺️ Roadmap (inclui Multitenancy)

  • v0.2

    • Documentar entidades principais no README (tabelas e relações).
    • Adicionar seeds básicos (sql/02_seed_minimo.sql).
    • Criar diagramas ER (PNG/SVG) em docs/erd.
  • v0.3

    • Introduzir tenant_id e índices por tenant (em tabelas de domínio).
    • Adicionar views de relatórios: contratos ativos, inadimplência, vacância.
    • Configurar GitHub Actions para validar o schema (spin-up de DB + import DDL).
  • v0.4

    • Criar políticas de acesso (RLS equivalente no MySQL via views + filtros por usuário).
    • Migrations com Flyway ou Liquibase.
    • Publicar Release v1.0 quando o modelo estabilizar.

Topics sugeridos (GitHub): sql, database, er-diagram, saas, real-estate, multitenancy, mysql.


🤝 Contribuição

  1. Faça um fork do projeto.
  2. Crie uma branch: git checkout -b feat/minha-melhoria
  3. Commit: git commit -m "feat: descreva sua melhoria"
  4. Push: git push origin feat/minha-melhoria
  5. Abra um Pull Request com contexto e screenshots (se houver).

Sugestões bem-vindas: diagramas ER, seeds, views, índices, políticas de acesso, migrações.


👤 Autor

André Dosciati
Especialista em Redes | Dados e Segurança | Educador em Tecnologia
🔗 LinkedIn: https://www.linkedin.com/in/andredosciati/
🔗 GitHub: https://github.com/dosciati