Recentemente, comecei a trabalhar em algum sistema legado. As pessoas que o desenvolveram tiveram a ideia de armazenar a lista de strings em um único campo da tabela do banco de dados. Vamos dizer que é um identificador para objeto que não possui nenhuma representação nem dados no banco de dados. O alcance desses identificadores será relativamente pequeno na produção.
Por outro lado, minhas intuições e o "bom gosto do design" me dizem que ele deve ser representado em uma tabela separada (semelhante a uma tabela usada para representar relações muitos-para-muitos).
A abordagem deles é realmente ruim e seria melhor iniciar uma refatoração? Se sim, quais as más consequências que o design original pode causar no futuro? Existem princípios de design relacional que explicam essa abordagem?
Edite na resposta para comentários:
Como suponho, eles não usaram essa abordagem para resolver um problema específico, como a estrutura hierárquica de uma maneira complicada. O cenário mais provável era que eles estavam simplesmente trabalhando sob pressão de tempo e precisavam implementar novos recursos o mais rápido possível.
Estou certo de que anteriormente o campo representava um valor único. Eles implementariam o recurso para armazenar mais de um valor e tentaram evitar migrações de banco de dados.
Respostas:
O modelo de dados não é normalizado; para ser assim, precisaria de uma mesa separada, como você diz. Nesse sentido, não é uma prática particularmente boa de modelagem de dados.
É difícil determinar se foi feito por um bom motivo ou não. É possível que a simplificação ou o desempenho da codificação possa ter sido motivador. O mais provável é que o campo contivesse originalmente um identificador, os requisitos foram alterados e os desenvolvedores não tiveram tempo ou inclinação para redimensionar.
Provavelmente mais importante é se você deve ou não se refatorar. Em circunstâncias semelhantes, não refatoraria preventivamente um caso como esse por padrão. Eu consideraria se um dos seguintes itens se aplicasse:
O que eu faria e TBH eu recomendaria isso sempre que você assumir um aplicativo legado, for iniciar um wiki (ou equivalente) e documentar casos como este. Por exemplo,
Descobri que este é um memorando de auxílio útil para mim enquanto trabalho e / ou volto para uma base de código. Também pode ser muito útil para o seu sucessor quando eles, por sua vez, precisam começar a aprender a base de código.
fonte
Seria geralmente considerado uma violação da normalização.
No entanto, às vezes isso é usado como solução para um problema, por exemplo, na estruturação hierárquica, em que uma cadeia de caminho de comprimento variável de algum tipo representa estrutura.
Entre os problemas com uma lista de itens em uma única cadeia de caracteres podem estar:
fonte
É um antipadrão comum para fazer isso.
Seus requisitos mudam e agora você precisa de mais valores em um local em que costumava precisar apenas de um. Como um livro tem apenas um autor, certo? Quem poderia imaginar que um livro tem vários autores? Essa é uma maneira fácil de atender a essa alteração de requisitos sem precisar alterar o esquema do banco de dados.
Existem algumas desvantagens.
Então, basicamente, por favor, não faça isso.
Basicamente, você está removendo o "relacional" no "banco de dados relacional".
fonte
Existem muitos argumentos para sermos uma péssima idéia. Eu acho que seria justo acrescentar algumas razões pelas quais seria uma boa ou pelo menos boa ideia. Não tenho certeza de quantas delas se aplicam a casos específicos, mas parece que pelo menos as observações de desempenho feitas são relevantes:
Ao tentar uma refatoração, é sempre uma boa idéia primeiro entender o motivo por trás das opções de design anteriores. Certifique-se de que as condições e requisitos tenham realmente mudado o suficiente para garantir o custo e o risco.
fonte