Dúvida Modelagem Banco de Dados, campo null

Ola a todos estou com uma dúvida na modelagem do meu banco de dados, vcs acham que eu ter na minha tabela dois campos, sendo que apenas um deve ser preenchido de acordo com o valor de outro campo e o outro ficar nulo é gambiarra? vou explicar melhor:

Estou em um projeto que tem como objetivo lançar as movimentações das linhas de onibus nos terminais, essa tabela de movimentação foi desenhada assim:

movimentacao_id; empresa_linha_id; quantidade_passageiros; horario; tipo_movimentação

onde é colocado um flag em tipo_movimentacao : (E)Embarque,(D)Desembarque,(N)Não realizada
e emquantidade_passageiros coloco a quantidade de passageiros do embarque ou desembarque.Temos a necessidade de gerar diversos relatórios de embarques e desembarques por linha,mes,ano,empresa… do jeito que essa tabela está eu não sei se é possivel agrupar embarques e desembarques juntos no mesmo select, emtão eu criei uma tabela chamada movimentacao_diaria
que consolida a movimentacao por dia, de acordo com qualquer operação feita na tabela de movimentação.A tabela movimentacao_diaria está assim:

mov_diaria_id; empresa_linha; qtd_embarques; qtd_desembarques,data

isso tá funcionando mas vou ter muitos registros no banco ,tanto em movimentações quanto em movimentações diarias, se eu tenho 400 empresa_linha(tabela intermedia entre empresa e linha) cadastradas * 365 dias = 146000 registros na tabela de movimentação_diaria por ano.

eu poderia reduzir bastante esse número de registros se utilizasse a tabela de movimentacao dessa forma:

movim_id; empresa_linha_id;qtd_embarque;qtd_desembarque;horario;tipo_movimentação
ai eu conseguiria agrupar os dados mas surge a situação que ou o campo qtd_embarques ou qtd_desembarques vai ficar sempre nulo dependendo do que estiver em tipo_movimentação.

ter esse tipo de modelagem deixando uma coluna nula é comum? é uma má prática? oque vcs me recomendam fazer?

Olá rjpereira1000000, bom dia.

Minha sugestão é trabalhar com duas tabelas, pai e filha. Percebo que seu receio seja quanto a quantidade de registros que você terá na tabela, mas como a tabela terá poucos campos, sendo a maioria campos inteiros, não vejo que será um problema pra você.

Com a separação em duas tabelas você conseguirá emitir seus relatórios e, se houve a necessidade de se adicionar um campo para prever uma nova situação no embarque, por exemplo, você precisará somente alterar uma tabela que contém embarques, sua tabela de movimentação continua a mesma.

Mas isso é uma visão que estou tendo ao ler o cenário que apresentou, veja qual sua necessidade atual e principalmente, veja onde esse sistema deverá chegar, já prepare-o para esse futuro.

Espero ter sido útil, abraços.

_ _
Fabiano Abreu
Papo Sql
Linkedin

Não deu pra entender se o banco que se refere é do aplicativo de relatório ou do sistema que alimenta o sistema de relatório com dados, mas penso que se você precisa sincronizar dados entre tabelas diariamente assim é porque você esta fazendo alguma coisa errada.

E precisa mesmo ser em um mesmo select? O que você quer dizer com “mesmo select”? Se for uma linha só por empresa, não sei como faz, mas talvez deve até ter um jeito. Agora, se puder ser duas linhas por empresa, dá para fazer unindo duas consultas agrupadas. Seria mais ou menos assim:

SELECT empresa_linha_id, tipo_movimentação, SUM(quantidade_passageiros) WHERE tipo_movimentação = ?embarque? GROUP BY empresa_linha_id, tipo_movimentação UNION SELECT empresa_linha_id, tipo_movimentação, SUM(quantidade_passageiros) WHERE tipo_movimentação = ?desembarque? GROUP BY empresa_linha_id, tipo_movimentação