Portanto, essa é mais uma questão de design.
Eu tenho uma chave primária (digamos o ID do usuário) e tenho toneladas de informações associadas a esse usuário.
Devo ter várias tabelas divididas em categorias de acordo com as informações ou devo ter apenas uma tabela com muitas colunas?
O jeito que eu costumava fazer isso era ter várias tabelas, por exemplo, uma tabela para dados de uso de aplicativos, uma tabela para informações de perfil, uma tabela para tokens de back-end etc. para manter as coisas organizadas.
Recentemente, alguém me disse que é melhor não fazer dessa maneira e ter uma mesa com muitas colunas é bom. O problema é que todas essas colunas têm a mesma chave primária.
Eu sou muito novo no design de banco de dados, então qual abordagem é melhor e quais são os prós e os contras?
Qual é a maneira convencional de fazer isso?
fonte
Respostas:
Sempre que as informações são individuais (cada usuário tem um nome e senha), é provavelmente melhor ter uma tabela, pois reduz o número de junções que o banco de dados precisará fazer para recuperar os resultados. Acho que alguns bancos de dados têm um limite no número de colunas por tabela, mas não me preocuparia em casos normais, e você sempre pode dividi-lo mais tarde, se precisar.
Se os dados forem um para muitos (cada usuário possui milhares de linhas de informações de uso), eles deverão ser divididos em tabelas separadas para reduzir dados duplicados (dados duplicados desperdiçam espaço de armazenamento, espaço em cache e dificulta a manutenção do banco de dados )
Você pode achar interessante o artigo da Wikipedia sobre normalização de banco de dados , pois discute os motivos disso em profundidade:
A desnormalização também é algo importante, pois há casos em que a repetição de dados é melhor (uma vez que reduz a quantidade de trabalho que o banco de dados precisa realizar ao ler os dados). Eu recomendo tornar seus dados o mais normalizados possível para começar e desnormalizar apenas se você estiver ciente de problemas de desempenho em consultas específicas.
fonte
Uma mesa grande geralmente é uma má escolha. As tabelas relacionadas são para as quais o banco de dados relacional foi projetado para trabalhar. Se você indexar corretamente e souber escrever consultas de alto desempenho, elas terão um bom desempenho.
Quando as tabelas recebem muitas colunas, você pode encontrar problemas com o tamanho real da página em que o banco de dados está armazenando as informações. O registro pode acabar sendo muito grande para a página, no qual você pode não conseguir criar ou atualizar um registro específico que deixa os usuários insatisfeitos ou você (pelo menos no SQL Server) pode receber algum estouro para determinados itens tipos de dados (com um conjunto de regras que você precisa procurar se estiver fazendo isso), mas se muitos registros excederem o tamanho da página, você poderá criar enormes problemas de desempenho. Agora, como o MYSQL lida com as páginas e se você tem um problema quando o tamanho potencial da página fica muito grande é algo que você precisaria procurar na documentação desse banco de dados.
fonte
Eu tenho um bom exemplo. Banco de dados excessivamente normalizado com o seguinte conjunto de relacionamentos:
e
Onde as pessoas têm nomes e detalhes de pessoas, a equipe possui apenas os detalhes do registro da equipe, os prospectos apenas os detalhes da perspectiva e as tabelas rel são tabelas de relacionamento com chaves estrangeiras de pessoas vinculadas à equipe e prospects.
Esse tipo de design continua para todo o banco de dados.
Agora, para consultar esse conjunto de relações, é sempre uma junção de várias tabelas, às vezes 8 ou mais junções de tabela. Ele tem funcionado bem até meados deste ano, quando começou a ficar muito lento agora que passamos de 40000 registros de pessoas.
A indexação e todos os frutos baixos foram usados no ano passado, todas as consultas são otimizadas com perfeição. Esse é o fim do caminho para o projeto e gerenciamento normalizado específico, que agora aprovou uma reconstrução de todo o aplicativo que depende dele, além da reestruturação do banco de dados, por um período de 6 meses. $$$$ Ouch.
A solução será ter uma relação direta
people -> staff
epeople -> prospect
fonte
type
serstaff
ou umprospect
?Me deparei com isso, e como alguém que costumava usar muito o MySQL e depois mudou para o Postgres recentemente, uma das grandes vantagens é que você pode adicionar objetos JSON a um campo no Postgres.
Portanto, se você está nessa situação, não precisa necessariamente decidir entre uma tabela grande com muitas colunas e dividi-la, mas pode mesclar colunas em objetos JSON para reduzi-la. Por exemplo, em vez de o endereço ter 5 colunas, ele pode simplesmente Seja um. Você também pode consultar esse objeto também.
fonte
faça a si mesmo essas perguntas se você colocar tudo em uma tabela. Você terá várias linhas para esse usuário? Se você precisar atualizar um usuário, deseja manter uma trilha de auditoria? O usuário pode ter mais de uma instância de um elemento de dados? (como número de telefone, por exemplo), você terá um caso em que poderá adicionar um elemento ou conjunto de elementos posteriormente? se você responder sim, provavelmente você deseja ter tabelas filho com relacionamentos de chave estrangeira.
Os profissionais das tabelas pai / filho são a integridade dos dados, o desempenho por meio de índices (sim, você também pode fazê-lo em uma tabela plana) e o IMO é mais fácil de manter, se você precisar adicionar um campo posteriormente, principalmente se for um campo obrigatório.
Contras design é mais difícil, as consultas se tornam um pouco mais complexas
Porém, existem muitos casos em que uma mesa grande e plana será apropriada; portanto, você deve analisar sua situação para decidir.
fonte
Já terminei de fazer algum tipo de design de banco de dados. para mim, depende da dificuldade do sistema com o gerenciamento de banco de dados; Sim, é verdade que só existem dados únicos em um só lugar, mas é realmente difícil fazer consultas com bancos de dados excessivamente normalizados e com muitos registros. Basta combinar os dois esquemas; use uma tabela enorme se achar que terá um grande número de registros difíceis de manter, como facebook, gmail, etc. e usar tabela diferente para um conjunto de registros para um sistema simples ... bem, esta é apenas a minha opinião .. espero que possa ajudar .. basta fazê-lo .. você pode fazê-lo ... :)
fonte
A maneira convencional de fazer isso seria usar tabelas diferentes como em um esquema em estrela ou em um esquema de floco de neve. No entanto, eu basearia essa estratégia em duas vezes. Acredito na teoria de que os dados deveriam existir apenas em um lugar, pois o esquema que mencionei funcionaria bem. No entanto, também acredito que, para mecanismos de relatório e suítes de BI, uma abordagem colunar seria extremamente benéfica, pois é mais favorável às necessidades de relatórios. Abordagens colunares como as do infobright.org têm enormes ganhos de desempenho e compactação, o que torna o uso de ambas as abordagens incrivelmente útil. Muitas empresas estão começando a perceber que apenas uma arquitetura de banco de dados na organização não suporta toda a gama de suas necessidades. Muitas empresas estão implementando o conceito de ter mais de uma arquitetura de banco de dados.
fonte
Eu acho que ter uma única tabela é mais eficaz, mas você deve se certificar de que a tabela esteja organizada de uma maneira que mostre o relacionamento, a tendência e a diferença nas variáveis da mesma linha. por exemplo, se a tabela mostra a idade e as notas dos alunos, você deve organizar a tabela de uma maneira que agradeça ao maior pontuador que seja bem diferenciada com o menor e que a diferença na idade dos alunos seja uniforme.
fonte