fundo
Sou estudante do primeiro ano do ensino médio e trabalho em meio período na pequena empresa de meu pai. Eu não tenho nenhuma experiência no desenvolvimento de aplicativos do mundo real. Eu escrevi scripts em Python, alguns cursos em C, mas nada como isso.
Meu pai tem uma pequena empresa de treinamento e atualmente todas as aulas são agendadas, gravadas e acompanhadas por um aplicativo da Web externo. Há um recurso de exportação / "relatórios", mas é muito genérico e precisamos de relatórios específicos. Não temos acesso ao banco de dados real para executar as consultas. Me pediram para configurar um sistema de relatórios personalizado.
Minha idéia é criar as exportações genéricas de CSV e importá-las (provavelmente com Python) para um banco de dados MySQL hospedado no escritório todas as noites, de onde eu possa executar as consultas específicas necessárias. Não tenho experiência em bancos de dados, mas entendo o básico. Eu li um pouco sobre criação de banco de dados e formas normais.
Podemos começar a ter clientes internacionais em breve, então quero que o banco de dados não exploda se / quando isso acontecer. Atualmente, também temos duas grandes corporações como clientes, com diferentes divisões (por exemplo, empresa-mãe da ACME, divisão de assistência médica da ACME, divisão de cuidados corporais da ACME)
O esquema que criei é o seguinte:
- Da perspectiva do cliente:
- Clientes é a tabela principal
- Os clientes estão vinculados ao departamento para o qual trabalham
- Os departamentos podem estar espalhados por um país: RH em Londres, Marketing em Swansea etc.
- Os departamentos estão vinculados à divisão de uma empresa
- As divisões estão vinculadas à controladora
- Da perspectiva das classes:
- Sessões é a tabela principal
- Um professor está vinculado a cada sessão
- Um statusid é fornecido para cada sessão. Por exemplo, 0 - Concluído, 1 - Cancelado
- As sessões são agrupadas em "pacotes" de tamanho arbitrário
- Cada pacote é atribuído a um cliente
- Sessões é a tabela principal
Eu "projetei" (mais como rabiscado) o esquema em um pedaço de papel, tentando mantê-lo normalizado no terceiro formulário. Depois, pluguei-o no MySQL Workbench e tudo ficou bonito para mim:
( Clique aqui para gráficos em tamanho normal )
(fonte: maian.org )
Consultas de exemplo que estarei executando
- Quais clientes com crédito ainda estão inativos (aqueles sem aula agendada no futuro)
- Qual é a taxa de participação por cliente / departamento / divisão (medida pelo ID do status em cada sessão)
- Quantas aulas um professor teve em um mês
- Sinalizar clientes com baixa taxa de participação
- Relatórios personalizados para departamentos de RH com taxas de participação de pessoas em sua divisão
Questões)
- Isso é superengenharia ou estou seguindo o caminho certo?
- A necessidade de ingressar em várias tabelas para a maioria das consultas resultará em um grande impacto no desempenho?
- Eu adicionei uma coluna 'dura-sessão' aos clientes, pois provavelmente será uma consulta comum. É uma boa ideia ou devo manter o banco de dados estritamente normalizado?
Obrigado pelo seu tempo
divisions
tem coluna chamada divisionid
. Você não acha isso redundante? Apenas cite id
. também os nomes das suas tabelas, incluindo _has_
: eu removeria isso e nomearia apenas por exemplo cities_departments
. suas DATETIME
colunas devem ser do tipo, a TIMESTAMP
menos que sejam valores de entrada do usuário. Eu acho que é uma boa ideia ter as tabelas cities
e countries
. você pode ter problemas para limitar as tabelas a uma única status
. considerar o uso de um INT
e realizar comparações bit a bit em ele- assim que você pode segurar mais significado lá