Design e Modelagem de Banco de Dados (Intermediário/Avançado)
Resposta:
3NF elimina dependências transitivas, enquanto BCNF elimina todas as dependências funcionais onde o determinante não é uma superchave. BCNF é uma forma mais rigorosa de 3NF. Você escolheria BCNF para maior integridade de dados se a tabela tiver chaves candidatas sobrepostas ou se um atributo não-chave determinar parte de uma chave candidata. Caso contrário, 3NF é frequentemente suficiente e menos complexa de alcançar.
O que é desnormalização e quando é apropriado usá-la? Forneça um exemplo.
Resposta:
Desnormalização é o processo de introduzir intencionalmente redundância em um banco de dados para melhorar o desempenho de leitura, muitas vezes combinando dados de várias tabelas em uma. É apropriado quando o desempenho de leitura é crítico e o overhead de joins é muito alto, ou para relatórios/data warehousing. Exemplo: Armazenar 'customer_name' diretamente em uma tabela 'orders', mesmo que ela exista em 'customers'.
Descreva o conceito de chave substituta (surrogate key) versus chave natural (natural key). Quais são as vantagens e desvantagens de cada uma?
Resposta:
Uma chave substituta é um identificador único gerado artificialmente (por exemplo, um inteiro auto-incrementável), enquanto uma chave natural é derivada dos próprios dados do negócio (por exemplo, ISBN para um livro). Chaves substitutas oferecem simplicidade, estabilidade (nunca mudam) e desempenho. Chaves naturais fornecem significado de negócio, mas podem ser complexas, mudar ao longo do tempo e podem ser compostas. Chaves substitutas são geralmente preferidas para chaves primárias.
Explique a diferença entre um esquema estrela (star schema) e um esquema floco de neve (snowflake schema) em data warehousing.
Resposta:
Um esquema estrela tem uma tabela de fatos central cercada por tabelas de dimensão desnormalizadas. É mais simples, mais rápido para consultas e mais fácil de entender. Um esquema floco de neve normaliza as tabelas de dimensão em várias tabelas relacionadas, formando uma estrutura semelhante a um floco de neve. Ele reduz a redundância de dados, mas aumenta a complexidade das consultas devido a mais joins.
O que é um índice e como ele melhora o desempenho das consultas? Quando um índice pode ser prejudicial?
Resposta:
Um índice é uma estrutura de dados que melhora a velocidade das operações de recuperação de dados em uma tabela de banco de dados. Ele funciona criando uma lista ordenada de valores de uma ou mais colunas, permitindo que o banco de dados localize rapidamente as linhas sem escanear a tabela inteira. Índices podem ser prejudiciais durante operações de escrita (INSERT, UPDATE, DELETE), pois precisam ser atualizados, aumentando o overhead e o armazenamento.
Discuta os trade-offs entre o design de banco de dados OLTP (Online Transaction Processing) e OLAP (Online Analytical Processing).
Resposta:
Sistemas OLTP são otimizados para transações curtas, de alto volume e concorrentes (inserções, atualizações, exclusões), enfatizando a integridade dos dados e a normalização. Sistemas OLAP são otimizados para consultas analíticas complexas sobre grandes conjuntos de dados, priorizando o desempenho de leitura e frequentemente usando esquemas desnormalizados (estrela/floco de neve). Eles atendem a diferentes necessidades de negócios, levando a filosofias de design distintas.
Como você lida com relacionamentos muitos-para-muitos em um design de banco de dados relacional? Forneça um exemplo.
Resposta:
Relacionamentos muitos-para-muitos são tratados introduzindo uma tabela intermediária (ou 'junction'/'associativa'). Esta tabela contém chaves estrangeiras referenciando as chaves primárias das duas tabelas relacionadas, formando uma chave primária composta. Exemplo: 'Students' e 'Courses' têm um relacionamento muitos-para-muitos, resolvido por uma tabela 'StudentCourses' com 'student_id' e 'course_id'.
O que é integridade de dados e quais mecanismos são usados para aplicá-la em um banco de dados?
Resposta:
Integridade de dados refere-se à precisão, consistência e confiabilidade dos dados ao longo de seu ciclo de vida. Mecanismos para aplicá-la incluem: Integridade de Entidade (Chaves Primárias, garantindo linhas únicas), Integridade Referencial (Chaves Estrangeiras, mantendo relacionamentos entre tabelas), Integridade de Domínio (restrições CHECK, tipos de dados, garantindo valores válidos) e Integridade Definida pelo Usuário (Triggers, Stored Procedures para regras de negócio complexas).
Explique o conceito de 'índice de cobertura' (covering index). Como ele beneficia o desempenho das consultas?
Resposta:
Um índice de cobertura é um índice que inclui todas as colunas necessárias para uma consulta, o que significa que o banco de dados pode recuperar todos os dados necessários diretamente do índice sem acessar as linhas reais da tabela. Isso melhora significativamente o desempenho, reduzindo o I/O de disco, pois a consulta pode ser satisfeita inteiramente pela varredura do índice.
Ao projetar um banco de dados, como você decide quais atributos devem fazer parte de uma chave primária composta versus atributos separados?
Resposta:
Uma chave primária composta é usada quando a exclusividade de um registro não pode ser garantida por um único atributo, mas requer uma combinação de dois ou mais. Você decide com base na exclusividade natural da entidade. Se atributos individuais não são inerentemente únicos, mas sua combinação é, uma chave composta é apropriada. Caso contrário, atributos separados ou uma chave substituta são melhores.