UNO Data Lake
Documentação das Tabelas
Este repositório contém os modelos de dados utilizados no Uno Data Lake, um sistema para gestão e armazenamento de dados de franquias e seus negócios relacionados. Esta documentação explica a estrutura de cada modelo e seus campos.
Bem-vindo(a) à documentação do UNO Data Lake. Este ambiente concentra os dados operacionais das franqueadoras e suas franquias/empresas em um cluster Amazon Redshift, permitindo a construção de dashboards, relatórios e análises de BI sobre uma base unificada.
Esta documentação descreve o que cada tabela representa, quais colunas existem, como elas se relacionam e como consultá-las corretamente. Foi escrita para um público misto: analistas de BI (com SQL básico) e engenheiros de dados.
Índice
- Visão geral
- Convenções importantes
- Mapa de relacionamentos
- Catálogo de tabelas
- Tabelas — Estrutura organizacional
- Tabelas — CRM e funil comercial
- Tabelas — Vendas (orders e itens)
- Tabelas — Financeiro
- Tabelas — Catálogo (produtos, serviços, planos, cursos)
- Tabelas — Operação clínica/atendimento
- Tabelas — Metas e desempenho
- Tabelas — Royalties e taxas da franqueadora
- Tabelas — Marketing (Facebook Ads)
- Tabelas — Sistema
- Enums e dicionários de valores
- Exemplos de queries para BI
- Boas práticas de performance no Redshift
Visão geral
O Data Lake recebe réplicas dos dados transacionais das aplicações operacionais (Vendas, CRM, Atendimento, Financeiro, Marketing) e os organiza em tabelas analíticas amplas, denormalizadas (com nomes já materializados em colunas *_name) para facilitar a leitura por ferramentas de BI.
Características principais:
- Banco: Amazon Redshift.
- Modelo: estrela "achatada" — cada tabela já contém o nome (denormalizado) das principais entidades relacionadas, evitando a maior parte dos JOINs em consultas típicas.
- Multi-tenant: todas as tabelas operacionais possuem a coluna
schemaque isola os dados de cada franquia/empresa. Toda consulta deve filtrar porschema. - Histórico: as tabelas refletem o estado atual da operação. Para análises temporais, use as colunas de data (
created_at,updated_at,due_date,liquidation_date, etc.).
Convenções importantes
Multi-tenant: a coluna schema e o franchisor_id
schema e o franchisor_idQuase todas as tabelas possuem duas colunas críticas:
| Coluna | Descrição |
|---|---|
schema | Identificador (string) da franquia/empresa dona do registro. Funciona como o "tenant" do Data Lake. É a DISTKEY na maioria das tabelas. |
franchisor_id | Identificador da franqueadora (rede/marca) à qual a franquia pertence. Permite consolidar dados entre todas as franquias de uma mesma rede. |
Por que isso importa? Os IDs de negócio (como order_id, customer_id, appointment_id) são gerados por franquia — ou seja, não são globalmente únicos. Duas franquias diferentes podem ter um order_id = 1234 apontando para vendas completamente distintas.
Regra de ouro dos JOINs
Toda relação entre tabelas deve ser feita pela combinação
schema+<id_de_negócio>— nunca apenas pelo ID.
Exemplos corretos:
-- ✅ CORRETO: JOIN por schema + order_id
SELECT *
FROM orders o
JOIN payments p
ON p.schema = o.schema
AND p.order_id = o.order_id
WHERE o.schema = 'minha_franquia';
-- ❌ INCORRETO: JOIN apenas por order_id
SELECT *
FROM orders o
JOIN payments p ON p.order_id = o.order_id; -- vai cruzar dados de franquias diferentes!Para análises a nível de franqueadora (várias franquias da mesma rede), filtre por franchisor_id e mantenha o schema em todos os JOINs:
SELECT *
FROM orders o
JOIN payments p
ON p.schema = o.schema
AND p.order_id = o.order_id
WHERE o.franchisor_id = '42';Chaves técnicas vs. chaves de negócio
Cada tabela tem uma coluna id (auto-incremento) usada apenas como chave primária técnica do Redshift. Ela não tem significado de negócio e pode ser ignorada em consultas analíticas.
Use sempre as colunas com sufixo _id (order_id, customer_id, appointment_id, …) — são essas que vêm dos sistemas operacionais e que devem ser usadas em filtros e JOINs (sempre combinadas com schema).
Distribuição e ordenação no Redshift (DISTKEY / SORTKEY)
Para entender por que filtrar por schema é tão importante, vale conhecer como o Redshift organiza as tabelas:
| Conceito | Como é usado aqui |
|---|---|
| DISTKEY | Coluna usada para distribuir as linhas entre os nós do cluster. Praticamente todas as tabelas usam schema como DISTKEY — isso garante que dados da mesma franquia fiquem no mesmo nó, acelerando JOINs locais. |
| SORTKEY | Colunas usadas para ordenar fisicamente os dados em disco. Geralmente é uma combinação de schema, <id_de_negócio> e franchisor_id. Filtros nessas colunas são extremamente rápidos. |
Implicação prática: consultas que não filtram por schema forçam o cluster a varrer dados em todos os nós, ficando muito mais lentas e caras.
Datas, fuso horário e tipos
- Todas as colunas de data/hora usam
TIMESTAMP WITH TIME ZONE(UTC). Converta para o fuso local da empresa (a colunacompanies.timezoneindica o fuso, ex.:America/Sao_Paulo) quando for exibir para o usuário final. - Valores monetários estão em
DOUBLE PRECISION(mapeados comoFLOATno ORM). Sempre useROUND(...)ao exibir. - A moeda padrão de cada empresa está em
companies.currency.
Atualização incremental (metadata)
metadata)A tabela metadata registra o último updated_at processado por tabela e por schema. Use-a se precisar saber até quando o Data Lake está atualizado para uma franquia específica.
Mapa de relacionamentos
franchises (1) ──< companies (N)
│
└──< franchise_royalties ──< franchise_royalty_periods
└──< franchise_advertising_fees ──< franchise_advertising_fee_periods
└──< franchise_category_types >── franchise_categories
customers ──┐
├──< deals
├──< budgets ──> orders
├──< orders ──< order_services ──> services
│ ──< order_products ──> products
│ ──< order_plans ──> plans
│ ──< order_courses ──> courses ──< classes
│ ──< order_lessons
│ ──< payments
├──< appointments ──> rooms ──< room_time_slots
├──< measures
└──< slimming_goals
employees ──< employee_goals >── goals
accounts_payable (financeiro – contas a pagar)
facebook_accounts ──< facebook_campaign_data
Todos os JOINs implícitos acima usam
schema + <id>.
Catálogo de tabelas
| Tabela | Domínio | Descrição rápida |
|---|---|---|
franchises | Organização | Franquias (unidades) cadastradas. |
companies | Organização | Dados cadastrais e de endereço das empresas. |
employees | Organização | Funcionários (vendedores, atendentes, etc.). |
customers | Organização | Clientes finais (PF/PJ). |
deals | CRM | Negociações/oportunidades do funil comercial. |
budgets | CRM | Orçamentos gerados para clientes. |
orders | Vendas | Vendas (pedidos) consolidadas. |
order_services | Vendas | Itens de serviço dentro de uma venda. |
order_products | Vendas | Itens de produto dentro de uma venda. |
order_plans | Vendas | Planos contratados em uma venda. |
order_courses | Vendas | Cursos contratados em uma venda. |
order_lessons | Vendas | Aulas individuais relacionadas a order_courses. |
payments | Financeiro | Recebíveis (parcelas) gerados por vendas. |
accounts_payable | Financeiro | Contas a pagar da empresa. |
services | Catálogo | Serviços oferecidos. |
products | Catálogo | Produtos oferecidos. |
plans | Catálogo | Planos comercializados. |
courses | Catálogo | Cursos oferecidos. |
classes | Catálogo | Turmas de cursos. |
appointments | Atendimento | Agendamentos de serviços. |
rooms | Atendimento | Salas de atendimento. |
room_time_slots | Atendimento | Janelas de funcionamento das salas. |
measures | Atendimento | Medidas corporais coletadas (ramo estética/saúde). |
slimming_goals | Atendimento | Metas de emagrecimento por cliente. |
goals | Metas | Metas globais da empresa por período. |
employee_goals | Metas | Metas individualizadas por funcionário. |
franchise_royalties | Franqueadora | Regras de cobrança de royalties por franquia. |
franchise_royalty_periods | Franqueadora | Valores apurados de royalties por período. |
franchise_advertising_fees | Franqueadora | Regras de taxa de publicidade. |
franchise_advertising_fee_periods | Franqueadora | Valores apurados de publicidade por período. |
franchise_categories | Franqueadora | Categorias de classificação de franquias. |
franchise_category_types | Franqueadora | Vínculo entre franquia e categoria. |
facebook_accounts | Marketing | Contas de anúncio do Facebook integradas. |
facebook_campaign_data | Marketing | Métricas diárias por campanha/anúncio. |
metadata | Sistema | Última sincronização do Data Lake por tabela/schema. |
Tabelas — Estrutura organizacional
franchises
franchisesFranquias (unidades operacionais) cadastradas.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
franchise_id | INTEGER | não | ID da franquia (chave de negócio). |
schema | VARCHAR(255) | não | Tenant. |
name | VARCHAR(255) | não | Nome da franquia. |
status | VARCHAR(255) | sim | Ver Status de franquia. |
created_at | TIMESTAMPTZ | não | Criação. |
updated_at | TIMESTAMPTZ | não | Última atualização. |
companies
companiesEmpresas (CNPJs) operadas pelas franquias. Em geral existe uma company por schema.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
company_id | INTEGER | não | ID da empresa. |
schema | VARCHAR(256) | não | Tenant. |
franchisor_id | INTEGER | sim | Franqueadora. |
legal_name | VARCHAR(256) | não | Razão social. |
name | VARCHAR(256) | não | Nome fantasia. |
cnpj | VARCHAR(256) | sim | CNPJ. |
status | VARCHAR(256) | não | Ver Status de empresa. |
street, number, neighborhood, zip_code | VARCHAR | sim | Endereço. |
city_name, city_identifier | VARCHAR | sim | Cidade e código IBGE. |
state_name, state_initials | VARCHAR | sim | Estado. |
country_name | VARCHAR | sim | País. |
timezone | VARCHAR | sim | Fuso horário (ex.: America/Sao_Paulo). |
locale | VARCHAR | sim | Locale (ex.: pt-BR). |
currency | VARCHAR | sim | Moeda (ex.: BRL). |
created_at / updated_at | TIMESTAMPTZ | não | Auditoria. |
employees
employeesFuncionários das empresas (vendedores, atendentes, profissionais, etc.).
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
employee_id | INTEGER | não | ID do funcionário. |
schema / franchisor_id | — | — | Tenant / rede. |
name | VARCHAR(255) | não | Nome. |
active | BOOLEAN | não | Está ativo? |
employee_type_id | INTEGER | não | ID do tipo (cargo/função). |
employee_type_name | VARCHAR(255) | não | Nome do tipo. |
employee_type_franchise_identifier | INTEGER | sim | ID do tipo no escopo da franquia. |
employee_type_franchisor | BOOLEAN | não | Se o tipo é definido pela franqueadora. |
expectedmeritlevel | VARCHAR(255) | sim | Nível de mérito esperado. |
created_at / updated_at | TIMESTAMPTZ | não | Auditoria. |
customers
customersClientes finais (PF e PJ).
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
customer_id | INTEGER | não | ID do cliente. |
schema / franchisor_id | — | — | Tenant / rede. |
franchise_id | INTEGER | sim | Franquia de origem. |
type | VARCHAR(255) | não | Tipo: pessoa física, jurídica, etc. |
name | VARCHAR(255) | sim | Nome (PF) ou nome fantasia (PJ). |
legal_name | VARCHAR(255) | sim | Razão social (PJ). |
cpf / cnpj | VARCHAR(255) | sim | Documento. |
email, cellphone, phone | VARCHAR(255) | sim | Contatos. |
gender | VARCHAR(255) | sim | Gênero. |
birthday | TIMESTAMPTZ | sim | Data de nascimento. |
occupation_id, occupation_name | — | sim | Ocupação/profissão. |
street, number, neighborhood, zip_code | — | sim | Endereço. |
city_id, city_name, state_id, state_name, country_id, country_name | — | sim | Localização. |
active | BOOLEAN | sim | Ativo? (default true). |
created_at / updated_at | TIMESTAMPTZ | não | Auditoria. |
Tabelas — CRM e funil comercial
deals
dealsNegociações/oportunidades do funil comercial. Um deal pode (ou não) ser convertido em uma order.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
deal_id | INTEGER | não | ID do deal. |
schema / franchisor_id | — | — | Tenant / rede. |
name | VARCHAR | sim | Nome/título do deal. |
customer_id | INTEGER | sim | Cliente vinculado. |
deal_origin_id, deal_origin_name | — | sim | Origem do lead. |
deal_stage_id, deal_stage_name | — | não | Estágio atual no funil. |
employee_id, employee_name | — | sim | Responsável. |
seller_id, seller_name | — | sim | Vendedor. |
aux_id, aux_name | — | sim | Auxiliar. |
total_price | FLOAT | sim | Valor potencial. |
rating | INTEGER | sim | Pontuação/qualificação. |
customer_appointment_date | TIMESTAMPTZ | sim | Data de agendamento de visita. |
customer_appointment_status_id | INTEGER | sim | Status do agendamento. |
converted_at | TIMESTAMPTZ | sim | Quando foi convertido em venda. |
discarded_at | TIMESTAMPTZ | sim | Quando foi descartado. |
order_id | INTEGER | sim | Venda gerada (JOIN com orders por schema + order_id). |
facebook_source_id, facebook_wacl_id | VARCHAR | sim | Rastreio de origem do Facebook Ads. |
created_at / updated_at | TIMESTAMPTZ | não | Auditoria. |
Para taxa de conversão:
dealscomconverted_at IS NOT NULLou comorder_idpreenchido.
budgets
budgetsOrçamentos elaborados para clientes.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
budget_id | INTEGER | não | ID do orçamento. |
schema / franchisor_id | — | — | Tenant / rede. |
status | VARCHAR(255) | não | Ver Status de orçamento. |
customer_id, customer_name | — | — | Cliente. |
employee_id, employee_name | — | — | Funcionário responsável. |
service_total_price, product_total_price, plan_total_price, course_total_price | FLOAT | não | Subtotais por categoria. |
total_price | FLOAT | não | Valor total. |
total_discount | FLOAT | não | Desconto aplicado. |
installment | INTEGER | sim | Nº de parcelas previsto. |
expiration_at | TIMESTAMPTZ | sim | Validade do orçamento. |
discarded_at | TIMESTAMPTZ | sim | Descartado em. |
converted_at | TIMESTAMPTZ | sim | Convertido em venda em. |
transformation | BOOLEAN | sim | Indica orçamento de transformação (renegociação). |
observation | VARCHAR | sim | Observação livre. |
observation_discarded | VARCHAR | sim | Motivo do descarte (texto). |
budget_discard_reason_id | INTEGER | sim | ID do motivo de descarte. |
order_id | INTEGER | sim | Venda originada deste orçamento. |
order_service_id | INTEGER | sim | Item de venda originado (quando aplicável). |
created_at / updated_at | TIMESTAMPTZ | não | Auditoria. |
Tabelas — Vendas (orders e itens)
orders
ordersCabeçalho da venda. Os itens estão nas tabelas order_services, order_products, order_plans, order_courses.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
order_id | INTEGER | não | ID da venda. |
schema / franchisor_id | — | — | Tenant / rede. |
status | VARCHAR(255) | não | Ver Status de venda. |
customer_id, customer_name | — | não | Cliente. |
seller_id, seller_name | — | não | Vendedor. |
aux_id, aux_name | — | sim | Vendedor auxiliar. |
service_total_price, product_total_price, plan_total_price, course_total_price | FLOAT | não | Subtotais por categoria. |
total_price | FLOAT | não | Valor total da venda. |
total_discount | FLOAT | não | Desconto total. |
total_paid | FLOAT | não | Total já pago. |
total_liquidated | FLOAT | não | Total liquidado (compensado). |
is_accounting | BOOLEAN | não | Se entra em contabilidade/relatórios financeiros. |
order_cancellation_reason_id, order_cancellation_name | — | sim | Motivo do cancelamento. |
order_abandonment_name | VARCHAR | sim | Motivo de abandono. |
canceled_at | TIMESTAMPTZ | sim | Data de cancelamento. |
created_at / updated_at | TIMESTAMPTZ | não | Auditoria. |
order_services
order_servicesItens de serviço de uma venda.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
order_service_id | INTEGER | não | ID do item. |
schema / franchisor_id | — | — | Tenant / rede. |
order_id | INTEGER | sim | Venda (JOIN schema + order_id). |
service_id | INTEGER | sim | Serviço do catálogo (JOIN schema + service_id). |
order_plan_id | INTEGER | sim | Se o serviço veio incluído num plano. |
quantity | INTEGER | sim | Quantidade. |
price | FLOAT | sim | Preço unitário. |
discount | FLOAT | sim | Desconto. |
additional_value | FLOAT | sim | Acréscimo. |
created_at / updated_at | TIMESTAMPTZ | não | Auditoria. |
order_products
order_productsItens de produto de uma venda.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
order_product_id | INTEGER | não | ID do item. |
schema / franchisor_id | — | — | Tenant / rede. |
order_id | INTEGER | sim | Venda. |
product_id | INTEGER | sim | Produto (JOIN schema + product_id). |
order_plan_id | INTEGER | sim | Se incluso em plano. |
quantity, price, discount, additional_value | — | sim | Quantidade e valores. |
created_at / updated_at | — | não | Auditoria. |
order_plans
order_plansPlanos contratados em uma venda.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
order_plan_id | INTEGER | não | ID do item. |
schema / franchisor_id | — | — | Tenant / rede. |
order_id | INTEGER | sim | Venda. |
plan_id | INTEGER | sim | Plano (JOIN schema + plan_id). |
price, discount, additional_value | FLOAT | sim | Valores. |
created_at / updated_at | — | não | Auditoria. |
order_courses
order_coursesCursos contratados em uma venda.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
order_course_id | INTEGER | não | ID do item. |
schema / franchisor_id | — | — | Tenant / rede. |
status | VARCHAR | sim | Status do curso contratado. |
course_id | INTEGER | sim | Curso (JOIN schema + course_id). |
order_id | INTEGER | sim | Venda. |
price, discount, additional_value | FLOAT | sim | Valores. |
created_at / updated_at | — | não | Auditoria. |
order_lessons
order_lessonsAulas individuais associadas a order_courses (controle de presença).
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
order_lesson_id | INTEGER | não | ID da aula contratada. |
schema / franchisor_id | — | — | Tenant / rede. |
order_course_id | INTEGER | sim | Vínculo com o curso comprado. |
course_id, course_name | — | sim | Curso. |
class_id, class_name | — | sim | Turma. |
lesson_id, lesson_name | — | não | Aula. |
customer_id, customer_name | — | não | Aluno. |
attendance | BOOLEAN | sim | Presença. |
start_date, end_date | TIMESTAMPTZ | sim | Janela da aula. |
created_at / updated_at | — | não | Auditoria. |
Tabelas — Financeiro
payments
paymentsRecebíveis (parcelas a receber) gerados pelas vendas.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
payment_id | INTEGER | não | ID do recebível. |
schema / franchisor_id | — | — | Tenant / rede. |
order_id | INTEGER | sim | Venda originadora (JOIN schema + order_id). |
customer_id, customer_name | — | sim | Cliente. |
employee_id, employee_name | — | não | Funcionário responsável (vendedor/financeiro). |
value | FLOAT | não | Valor da parcela. |
installment | FLOAT | sim | Número da parcela. |
original_due_date | TIMESTAMPTZ | sim | Vencimento original. |
due_date | TIMESTAMPTZ | não | Vencimento atual. |
liquidation_date | TIMESTAMPTZ | sim | Data de liquidação (compensação). |
billed_date | TIMESTAMPTZ | não | Data de faturamento. |
interest_value | FLOAT | sim | Juros. |
fee_value | FLOAT | sim | Tarifa. |
discount_value | FLOAT | sim | Desconto concedido. |
store | BOOLEAN | não | Recebido no balcão (loja)? |
payment_status_id, payment_status_name | — | não | Status. Ver Status de pagamento. |
payment_type_id, payment_type_name | — | não | Forma/tipo de pagamento. |
payment_brand_id, payment_brand_name | — | sim | Bandeira (cartão, boleto, etc.). |
chart_account_id, chart_account_name | — | sim | Plano de contas. |
credit_card_brand | VARCHAR | sim | Bandeira do cartão (integrações). |
last_credit_card_number | VARCHAR | sim | Últimos 4 dígitos. |
created_at / updated_at | — | não | Auditoria. |
accounts_payable
accounts_payableContas a pagar da empresa (despesas, fornecedores, etc.).
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
account_payable_id | INTEGER | não | ID da conta. |
schema / franchisor_id | — | — | Tenant / rede. |
description | VARCHAR(255) | não | Descrição. |
type | VARCHAR(255) | não | Tipo. |
value | FLOAT | não | Valor. |
installment | FLOAT | não | Parcela. |
fees | FLOAT | sim | Juros. |
fine | FLOAT | sim | Multa. |
due_date | TIMESTAMPTZ | não | Vencimento. |
payment_date | TIMESTAMPTZ | sim | Data do pagamento. |
competence_date | TIMESTAMPTZ | sim | Competência contábil. |
supplier_id, supplier_name | — | sim | Fornecedor. |
payment_brand_id, payment_brand_name | — | sim | Forma de pagamento. |
chart_account_id, chart_account_name | — | sim | Plano de contas. |
cost_center_id, cost_center_name | — | sim | Centro de custo. |
created_at / updated_at | — | não | Auditoria. |
Tabelas — Catálogo (produtos, serviços, planos, cursos)
Todas as tabelas de catálogo seguem o mesmo padrão:
*_id,schema,franchisor_id,franchise_identifier(id no escopo da franquia),name,price,active,created_at,updated_at.
services
servicesServiços oferecidos pela franquia.
| Coluna extra | Tipo | Descrição |
|---|---|---|
is_budget | BOOLEAN | Se o serviço só pode ser vendido via orçamento. |
products
productsProdutos comercializados. Sem colunas adicionais além do padrão.
plans
plansPlanos comercializados. Sem colunas adicionais além do padrão.
courses
coursesCursos oferecidos. Sem colunas adicionais além do padrão.
classes
classesTurmas de cursos.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
class_id | INTEGER | não | ID da turma. |
schema / franchisor_id | — | — | Tenant / rede. |
name | VARCHAR(255) | não | Nome da turma. |
start_date, end_date | TIMESTAMPTZ | sim | Período da turma. |
is_cyclic | BOOLEAN | não | Turma cíclica? |
class_limit | FLOAT | sim | Limite de alunos. |
minimum_frequency | FLOAT | sim | Frequência mínima exigida. |
class_status_id, class_status_name | — | não | Status da turma. |
course_id, course_name | — | sim | Curso. |
employee_id, employee_name | — | sim | Professor responsável. |
created_at / updated_at | — | não | Auditoria. |
Tabelas — Operação clínica/atendimento
appointments
appointmentsAgendamentos de serviços para clientes.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
appointment_id | INTEGER | não | ID do agendamento. |
schema / franchisor_id | — | — | Tenant / rede. |
order_id | INTEGER | não | Venda relacionada. |
customer_id, customer_name | — | não | Cliente. |
employee_id, employee_name | — | sim | Profissional. |
service_id, service_franchise_identifier, service_name | — | — | Serviço. |
service_budget | BOOLEAN | não | É serviço de orçamento? |
status_id | INTEGER | não | Status. Ver Status de agendamento. |
service_session | INTEGER | não | Nº da sessão. |
start_date, end_date | TIMESTAMPTZ | sim | Janela do atendimento. |
room_id, room_name | — | sim | Sala (JOIN schema + room_id). |
rating | INTEGER | sim | Avaliação do cliente. |
rescheduled | INTEGER | não | Quantidade de reagendamentos. |
created_at / updated_at | — | não | Auditoria. |
rooms
roomsSalas de atendimento.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
room_id | INTEGER | não | ID da sala. |
schema / franchisor_id | — | — | Tenant / rede. |
name | VARCHAR(256) | não | Nome. |
customer_limits | INTEGER | não | Capacidade simultânea. |
status | VARCHAR(256) | não | Status (ativa/inativa, etc.). |
employee_id | INTEGER | sim | Funcionário responsável. |
created_at / updated_at | — | não | Auditoria. |
room_time_slots
room_time_slotsJanelas de funcionamento das salas (por dia da semana).
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
room_time_slot_id | INTEGER | não | ID. |
schema / franchisor_id | — | — | Tenant / rede. |
room_id | INTEGER | não | Sala. |
day_of_week | VARCHAR(256) | não | Dia da semana (ex.: MONDAY). |
start_time | INTEGER | não | Início (em minutos a partir de 00:00). |
end_time | INTEGER | não | Fim (em minutos a partir de 00:00). |
created_at / updated_at | — | não | Auditoria. |
measures
measuresMedidas corporais coletadas (típico de redes de estética/saúde).
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
measure_id | INTEGER | não | ID da medição. |
schema / franchisor_id | — | — | Tenant / rede. |
customer_id | INTEGER | não | Cliente. |
order_service_id | INTEGER | sim | Item de venda associado. |
date | TIMESTAMPTZ | sim | Data da medição. |
weight, height | FLOAT | sim | Peso e altura. |
hip, waist, high_waist, low_waist | FLOAT | sim | Quadril e cinturas. |
left_arm, right_arm | FLOAT | sim | Braços. |
left_thigh_high, left_thigh_low, right_thigh_high, right_thigh_low | FLOAT | sim | Coxas. |
calf | FLOAT | sim | Panturrilha. |
abdominal_circumference | FLOAT | sim | Circunferência abdominal. |
fat_percentage | FLOAT | sim | % de gordura. |
blood_pressure_max, blood_pressure_min | FLOAT | sim | Pressão arterial. |
baseline_measure | FLOAT | sim | Linha de base. |
first_measure | BOOLEAN | sim | É a primeira medição? |
observation | VARCHAR | sim | Observação. |
created_at / updated_at | — | não | Auditoria. |
slimming_goals
slimming_goalsMetas de emagrecimento por cliente.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
slimming_goal_id | INTEGER | não | ID. |
schema / franchisor_id | — | — | Tenant / rede. |
customer_id | INTEGER | não | Cliente. |
start_date, end_date | TIMESTAMPTZ | não | Período da meta. |
finished_at | TIMESTAMPTZ | sim | Quando concluída. |
weight, height, hip, waist, high_waist, low_waist, left_arm, right_arm, left_thigh_high, left_thigh_low, right_thigh_high, right_thigh_low, calf | FLOAT | sim | Medidas-alvo. |
observation | VARCHAR | sim | Observação. |
created_at / updated_at | — | não | Auditoria. |
Tabelas — Metas e desempenho
goals
goalsMetas globais da empresa por período.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
goal_id | INTEGER | não | ID. |
schema / franchisor_id | — | — | Tenant / rede. |
initial_date, end_date | TIMESTAMPTZ | não | Período da meta. |
indication | INTEGER | sim | Meta de indicações. |
product, service, plan, course, transformation | FLOAT/INT | sim | Metas por categoria. |
ticket | FLOAT | sim | Meta de ticket médio. |
efficiency | FLOAT | sim | Meta de eficiência. |
total | FLOAT | sim | Meta total (R$). |
count_days, count_past_days | INTEGER | sim | Dias úteis no período / já transcorridos. |
created_at / updated_at | — | não | Auditoria. |
employee_goals
employee_goalsMetas individuais por funcionário.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
employee_goal_id | INTEGER | não | ID. |
schema / franchisor_id | — | — | Tenant / rede. |
employee_id | INTEGER | não | Funcionário. |
goal_id | INTEGER | sim | Meta global associada. |
initial_date, end_date | TIMESTAMPTZ | não | Período. |
indication, product, service, plan, course, transformation, total | FLOAT/INT | sim | Metas por categoria. |
count_days, count_past_days | INTEGER | não | Dias do período / dias passados. |
created_at / updated_at | — | não | Auditoria. |
Tabelas — Royalties e taxas da franqueadora
franchise_royalties
franchise_royaltiesRegras de cobrança de royalties por franquia.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
franchise_royalty_id | INTEGER | não | ID da regra. |
schema | VARCHAR(255) | não | Tenant. |
franchise_id | INTEGER | não | Franquia. |
start_at, end_at | TIMESTAMPTZ | sim/não | Vigência. |
due_day | INTEGER | não | Dia de vencimento. |
type | VARCHAR(255) | não | Tipo de cobrança. |
min_value | FLOAT | sim | Valor mínimo. |
percentage | FLOAT | sim | Percentual. |
calculation_type | VARCHAR(255) | sim | Forma de cálculo (sobre faturamento, etc.). |
payment_brand_id, payment_brand_name | — | sim | Forma de pagamento. |
created_at / updated_at | — | não | Auditoria. |
franchise_royalty_periods
franchise_royalty_periodsValores apurados de royalties por período.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
franchise_royalty_period_id | INTEGER | não | ID. |
schema | VARCHAR | não | Tenant. |
franchise_royalty_id | INTEGER | não | Regra associada. |
start_at, end_at | TIMESTAMPTZ | não | Período de apuração. |
value | FLOAT | não | Valor apurado. |
created_at / updated_at | — | não | Auditoria. |
franchise_advertising_fees
franchise_advertising_feesRegras de taxa de publicidade. Mesma estrutura de franchise_royalties, trocando royalty por advertising_fee.
franchise_advertising_fee_periods
franchise_advertising_fee_periodsValores apurados de taxa de publicidade. Mesma estrutura de franchise_royalty_periods, trocando royalty por advertising_fee.
franchise_categories
franchise_categoriesCategorias para classificar franquias.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
franchise_category_id | INTEGER | não | ID. |
schema | VARCHAR | não | Tenant. |
name | VARCHAR | não | Nome da categoria. |
active | BOOLEAN | não | Ativa? |
created_at / updated_at | — | não | Auditoria. |
franchise_category_types
franchise_category_typesTabela de junção entre franquia e categoria.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
schema | VARCHAR | não | Tenant. |
franchise_category_id | INTEGER | não | Categoria. |
franchise_id | INTEGER | não | Franquia. |
created_at / updated_at | — | não | Auditoria. |
Tabelas — Marketing (Facebook Ads)
facebook_accounts
facebook_accountsContas de anúncio do Facebook integradas.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
facebook_account_id | INTEGER | não | ID. |
schema / franchisor_id | — | — | Tenant / rede. |
name | VARCHAR | sim | Nome da conta. |
account_status | INTEGER | sim | Status (códigos do Facebook). |
currency | VARCHAR | sim | Moeda. |
amount_spent | VARCHAR | sim | Total gasto (acumulado). |
spend_cap | VARCHAR | sim | Limite de gasto. |
business_id, business_name | VARCHAR | sim | Business Manager. |
bm_id | VARCHAR | sim | ID do BM. |
created_time | TIMESTAMPTZ | sim | Quando a conta foi criada no Facebook. |
last_campaign_sync | TIMESTAMPTZ | sim | Última sincronização. |
active | BOOLEAN | sim | Está ativa no nosso sistema? |
created_at / updated_at | — | não | Auditoria. |
facebook_campaign_data
facebook_campaign_dataMétricas diárias por anúncio.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
facebook_campaign_data_id | INTEGER | não | ID. |
schema / franchisor_id | — | — | Tenant / rede. |
account_id | VARCHAR | não | Conta de anúncio. |
identifier | VARCHAR | não | Identificador do registro. |
date | DATE | não | Dia da métrica. |
source_id | VARCHAR | não | ID de origem (anúncio). |
ad_campaign_name, ad_set_name, ad_name | VARCHAR | não | Hierarquia do anúncio. |
total_spent | FLOAT | não | Gasto. |
impressions, link_clicks, reach | INTEGER | não | Métricas de entrega. |
frequency | FLOAT | não | Frequência. |
started_messages | INTEGER | não | Conversas iniciadas. |
video_view_25_count, video_view_50_count, video_view_75_count, video_view_95_count | INTEGER | não | Visualizações de vídeo por % assistido. |
created_at / updated_at | — | não | Auditoria. |
Para atribuir leads/vendas a campanhas, cruze com
deals.facebook_source_id.
Tabelas — Sistema
metadata
metadataRegistra a última atualização processada para cada par (schema, table).
| Coluna | Tipo | Descrição |
|---|---|---|
schema | VARCHAR(255) | Tenant. |
table | VARCHAR(256) | Nome da tabela. |
last_updated | TIMESTAMPTZ | Maior updated_at já carregado para essa tabela/schema. |
Use para verificar a "freshness" do Data Lake:
SELECT "table", last_updated
FROM metadata
WHERE schema = 'minha_franquia'
ORDER BY "table";Enums e dicionários de valores
franchises.status
franchises.status| Valor | Significado |
|---|---|
IN_IMPLEMENTATION | Em implementação. |
ACTIVE | Ativa. |
TERMINATION_REQUEST | Solicitação de encerramento. |
TERMINATION | Em encerramento. |
CANCELED | Cancelada. |
LEGAL | Em situação jurídica. |
companies.status
companies.status| Valor | Significado |
|---|---|
ACTIVE | Ativa. |
INACTIVE | Inativa. |
IMPLANTATION | Em implantação. |
BLOCKED | Bloqueada. |
orders.status
orders.status| Valor | Significado |
|---|---|
BILLED | Faturada. |
CLOSED | Fechada. |
CANCELED | Cancelada. |
ABANDONMENT | Abandono. |
PENDING_BALANCE | Saldo pendente. |
budgets.status
budgets.status| Valor | Significado |
|---|---|
PENDING | Aguardando. |
ACCOMPLISHED | Realizada. |
CONVERTED | Convertida em venda. |
DISCARDED | Descartada. |
payments.payment_status_id
payments.payment_status_id| ID | Nome |
|---|---|
| 0 | Cancelado |
| 1 | Pendente |
| 2 | Conciliação |
| 3 | Vencido |
| 4 | Liquidado |
appointments.status_id
appointments.status_id| ID | Nome |
|---|---|
| 1 | Agendado |
| 2 | Confirmado |
| 3 | Em espera |
| 4 | Em andamento |
| 5 | Realizado |
| 6 | Falta |
| 7 | Bloqueio |
Exemplos de queries para BI
Em todos os exemplos, troque
'minha_franquia'peloschemadesejado.
1. Faturamento mensal (vendas faturadas)
SELECT date_trunc('month', created_at) AS mes,
SUM(total_price) AS faturamento,
COUNT(*) AS qtd_vendas
FROM orders
WHERE schema = 'minha_franquia'
AND status = 'BILLED'
AND created_at >= '2025-01-01'
GROUP BY 1
ORDER BY 1;2. Recebíveis pendentes (a vencer e vencidos)
SELECT payment_status_name,
COUNT(*) AS qtd,
SUM(value) AS total
FROM payments
WHERE schema = 'minha_franquia'
AND payment_status_id IN (1, 3) -- Pendente, Vencido
GROUP BY 1;3. Ranking de vendedores no mês
SELECT seller_id,
seller_name,
COUNT(*) AS qtd_vendas,
SUM(total_price) AS receita,
SUM(total_paid) AS recebido
FROM orders
WHERE schema = 'minha_franquia'
AND status = 'BILLED'
AND created_at >= date_trunc('month', current_date)
GROUP BY 1, 2
ORDER BY receita DESC;4. Conversão do funil de CRM
SELECT COUNT(*) AS leads,
COUNT(converted_at) AS convertidos,
COUNT(discarded_at) AS descartados,
ROUND(100.0 * COUNT(converted_at) / NULLIF(COUNT(*),0), 2) AS taxa_conversao_pct
FROM deals
WHERE schema = 'minha_franquia'
AND created_at >= current_date - INTERVAL '90 days';5. Vendas com seus pagamentos (uso correto do JOIN)
SELECT o.order_id,
o.customer_name,
o.total_price,
o.total_paid,
p.payment_id,
p.value,
p.due_date,
p.payment_status_name
FROM orders o
JOIN payments p
ON p.schema = o.schema -- ✅ obrigatório
AND p.order_id = o.order_id
WHERE o.schema = 'minha_franquia'
AND o.created_at >= current_date - INTERVAL '30 days';6. Ocupação de agenda por profissional
SELECT employee_id,
employee_name,
COUNT(*) FILTER (WHERE status_id = 5) AS realizados,
COUNT(*) FILTER (WHERE status_id = 6) AS faltas,
COUNT(*) AS total_agendamentos
FROM appointments
WHERE schema = 'minha_franquia'
AND start_date >= date_trunc('month', current_date)
GROUP BY 1, 2
ORDER BY total_agendamentos DESC;7. Custo por lead (Facebook Ads × Deals)
WITH gasto AS (
SELECT date, SUM(total_spent) AS spent
FROM facebook_campaign_data
WHERE schema = 'minha_franquia'
AND date >= current_date - INTERVAL '30 days'
GROUP BY 1
),
leads AS (
SELECT date(created_at) AS date, COUNT(*) AS qtd
FROM deals
WHERE schema = 'minha_franquia'
AND facebook_source_id IS NOT NULL
AND created_at >= current_date - INTERVAL '30 days'
GROUP BY 1
)
SELECT g.date,
g.spent,
l.qtd AS leads,
ROUND(g.spent / NULLIF(l.qtd, 0), 2) AS cpl
FROM gasto g
LEFT JOIN leads l ON l.date = g.date
ORDER BY g.date;8. Consolidado por franqueadora (várias franquias da mesma rede)
SELECT schema,
SUM(total_price) AS faturamento
FROM orders
WHERE franchisor_id = '42'
AND status = 'BILLED'
AND created_at >= date_trunc('month', current_date)
GROUP BY schema
ORDER BY faturamento DESC;Boas práticas de performance no Redshift
- Sempre filtre por
schema. É aDISTKEYe a primeiraSORTKEYda maioria das tabelas. Sem isso, o cluster faz varredura completa. - Faça JOINs por
schema + <id>. Isso evita "data movement" entre nós (porque ambos os lados do JOIN ficam no mesmo nó). - Use os campos
*_namedenormalizados sempre que possível, em vez de fazer JOIN com tabelas-mestras (customers,services, etc.). Eles existem justamente para evitar JOINs em queries comuns de BI. - Filtre por colunas da
SORTKEY(geralmenteschema,<id_de_negócio>,franchisor_id). Filtros nessas colunas são extremamente baratos. - Evite
SELECT *— Redshift é colunar; selecionar apenas as colunas necessárias reduz drasticamente o I/O. - Prefira agregações
GROUP BYem colunas de baixa cardinalidade (status, employee_id, schema) e dimensões temporais (date_trunc(...)). - Use
WITH(CTEs) para deixar a query mais legível — o otimizador do Redshift lida bem com elas. - Janelas curtas no
created_at/updated_atajudam muito (ex.: últimos 90 dias) e reduzem o volume escaneado. - Para reprocessamentos, consulte
metadatapara saber até onde o Data Lake está atualizado.
Em caso de dúvidas sobre o significado de um campo ou enum específico, consulte o time de dados — esta documentação é viva e será atualizada conforme novas tabelas e colunas forem adicionadas ao Data Lake.