Tenho um colega que vive colocando conteúdo misto em uma coluna. Por exemplo, este caso atual com o qual estou lutando é uma coluna chamada "opts", que é uma matriz de inteiros. Dependendo de um tipo que nem está presente na linha atual, você terá que juntar outra tabela para descobrir isso, esta coluna pode conter:
- um 0 ou um 1 - significando um estado ligado/desligado
- uma lista de IDs de uma tabela
- uma lista de IDs de uma segunda tabela
- null em qualquer outro caso
Para mim, isso parece mais desordem do que dados organizados. Então, existe um conceito de design de banco de dados que isso viola ou é apenas meu TOC? Quais devem ser meus argumentos quando tento persuadi-lo a não fazer mais isso?
Gostaria de acrescentar que os IDs da tabela não precisam de chaves estrangeiras por motivos que não vale a pena entrar, o colega faz isso com outras coisas também, por exemplo outra coluna em outra tabela tem uma string ou um texto json . O que eu faria nesses casos é ter mais colunas, uma para cada caso, e preencher apenas uma delas e deixar as demais como nulas.
Primeiro estou fazendo algumas suposições:
1,2,3,4,5
etcopts
é um tipo de dados de string como VARCHAR / NVARCHAR / CHAR etcVocê não menciona seu DBMS. Minha resposta é baseada no SQL Server, então algumas das coisas que mencionei podem não ser relevantes para outros DBMS
Para mim, o padrão que você descreve é "One True lookup table (OTLT)", onde você tem uma única tabela de várias entidades diferenciadas por alguma chave ou valor, por exemplo:
Isso pode ser usado porque quando um novo tipo de entidade é criado, ele pode ser criado inserindo dados em uma tabela em vez de alterar o esquema do banco de dados. Pode potencialmente ser válido quando os diferentes tipos de entidades têm propriedades comuns (no caso acima - um nome e uma data de criação)
No entanto, começa a cair quando queremos adicionar novas propriedades a uma entidade, por exemplo, a idade de uma pessoa. Nesse caso, adicionaríamos uma coluna de idade à tabela, mas o valor nessa coluna teria significado apenas para algumas das linhas da tabela; isso pode rapidamente se tornar confuso e difícil de trabalhar.
Algumas reflexões sobre por que o OTLT e o armazenamento de listas delimitadas por vírgulas são ruins
Para facilitar a explicação, direi que você tem uma linha que possui uma lista de PersonIDs que são armazenados nesta tabela por algum motivo e que você tem uma tabela de pessoa separada onde PersonID é exclusivo
Quanto aos conceitos de design, as listas delimitadas por vírgulas violam a primeira forma normal e o OTLT potencialmente viola a segunda forma normal
FWIW, eu vivi a dor que esses padrões causam e eles são apenas IMO desagradáveis. Convencer aqueles que os criaram a eliminá-los provavelmente exigirá testes que evidenciem os pontos acima - ao testar, não pense necessariamente em quantos dados você tem agora, pense em 1, 3, 5 anos