O título não faz muito sentido, mas não consegui pensar em um título melhor para esse problema.
Eu tenho as seguintes tabelas
Projetos
- identidade
- nome
clientes
- identidade
- id_project
- nome
Pagamentos
- identidade
- id_customer
- encontro
- soma
Quando um usuário entra no sistema, ele terá acesso a um determinado projeto. Agora, quero listar todos os pagamentos desse projeto e deve ser bem fácil:
SELECT FROM payments where id_customer in (SELECT id from customers where id_project = 5)
Minha pergunta é: se não for melhor adicionar uma coluna id_project à tabela de pagamentos dessa maneira, as consultas serão mais fáceis e rápidas.
database-design
normalization
Gabriel Solomon
fonte
fonte
Respostas:
Parece que você está perguntando se a desnormalização faz sentido.
A resposta é sempre "depende", então aqui está minha regra de ouro:
E se ...
então fique normalizado . Sim, a desnormalização é mais rápida, mas também significa que você possui dados redundantes no sistema - dados que precisam ser mantidos e sincronizados. Não há mais "uma fonte" para esses dados, mas várias fontes que podem se desviar. Isso é arriscado ao longo do tempo, portanto, você não deve fazê-lo, a menos que tenha boas razões para fazê-lo, apoiado por alguns parâmetros de referência.
Eu só desnormalizaria quando ...
As junções são muito rápidas no hardware moderno, mas nunca são gratuitas.
fonte
Seria melhor reescrever a consulta como:
Embora isso pareça menos conciso e um bom planejador de consultas veja o que você está tentando fazer e execute sua subconsulta correlacionada como a junção acima, um planejador de consultas ruim pode acabar fazendo uma varredura de índice
payments.id_customer
(supondo que você tenha um índice relevante ) (ou pior, varredura de tabela) em vez de fazer as coisas da maneira mais eficiente. Mesmo um bom planejador de consultas pode não conseguir ver a otimização se o arranjo dessa consulta estiver envolvido em algo mais complicado. Expressar o relacionamento como uma junção em vez de uma subconsulta pode fazer mais diferença do que alterar sua estrutura de dados.Como Jeff diz, qualquer desnormalização deve ser considerada com cuidado - isso pode proporcionar um aumento fácil no desempenho, principalmente para fins de geração de relatórios, mas pode levar à inconsistência devido a erros na lógica comercial de suporte.
Como uma observação lateral: obviamente eu não conheço o seu negócio, então poderia estar perdendo alguma coisa, mas o seu relacionamento com a mesa me parece estranho. Elas implicam que você nunca pode ter mais de um projeto com o mesmo cliente, o que geralmente não é verdade na minha experiência, pelo menos por um longo período.
ou se estiver sendo menos normalizado (embora eu duvide que seja necessário):
Claro que isso ainda desconta a possibilidade de um projeto conjunto com dois clientes ...
fonte
DROP VIEW
+CREATE VIEW
em vez deALTER VIEW
.Em alguns bancos de dados, você tem a possibilidade de criar "Visualizações materializadas" em vez de VIEWS complexas com uma grande quantidade de dados, com base em uma consulta complexa. Isso pode ser usado para evitar a desnormalização em um sistema de aplicativo histórico. Se você decidir usar " Vistas materializadas ", é necessário ter uma idéia clara dos métodos de atualização e a quantidade de armazenamento que será usada pela Visualização materializada ...
fonte