Uma tabela de uma coluna é um bom design? [fechadas]


111

Tudo bem ter uma tabela com apenas uma coluna? Eu sei que não é tecnicamente ilegal, mas é considerado um design ruim?

EDITAR:

Aqui estão alguns exemplos:

  • Você tem uma tabela com os 50 códigos de estado dos EUA válidos, mas não precisa armazenar os nomes de estado detalhados.
  • Uma lista negra de e-mail.

Alguém mencionou a adição de um campo-chave. A meu ver, essa única coluna SERIA a chave primária.


Estou tendo um pouco de dificuldade em imaginar um caso de uso para uma tabela com apenas uma coluna. Você pode dar um exemplo?
Paul Morie

mas pelo menos não crie um índice para ele!
Sathya

3
Os códigos de estado dos EUA são um exemplo clássico de definição de um domínio
Quassnoi

3
Já vi uma tabela de banco de dados usada para conter um valor de bloqueio para um aplicativo antes
Russ Cam

Meu uso para este padrão foi criar conjuntos de dados. Cada registro da tabela principal possui um campo SET. Registros com o mesmo SET são conectados. Como você insere vários registros com o mesmo SET? 'INSERT INTO sets VALUES ()' e então use o último ID de inserção como seu SET ID para anexar aos registros. Então, novamente, talvez eu pudesse ter usado UUIDs, mas algo parece errado sobre isso.
William Entriken

Respostas:


87

Sim, certamente é um bom design projetar uma mesa de forma a torná-la mais eficiente. "Projeto RDBMS ruim" geralmente é centrado na ineficiência.

No entanto, descobri que a maioria dos casos de design de coluna única poderia se beneficiar de uma coluna adicional. Por exemplo, os Códigos de estado geralmente podem ter o nome completo do estado escrito em uma segunda coluna. Ou uma lista negra pode ter notas associadas. Mas, se o seu projeto realmente não precisa dessa informação, então é perfeitamente normal ter uma coluna única.


168

Em termos relational algebradisso, seria uma relação unária, o que significa que " essa coisa existe "

Sim, é bom ter uma tabela definindo tal relação: por exemplo, para definir um domínio.

Os valores de tal tabela devem ser chaves primárias naturais, é claro.

Uma tabela de pesquisa de prime numbersé o que vem à minha mente primeiro.


3
+1: A tabela é um conjunto de valores que são tipos primitivos de seu RDBMS.
S.Lott

4
1 para fornecer resposta com base na teoria relacional.
lubos hasko

Aqui está um bom exemplo de um esquema que tem uma tabela de 1 coluna que não é uma chave natural, a tabela Thread em um sistema de mensagens ... stackoverflow.com/a/6542556/45767
JeremyWeir

29

Eu os usei no passado. Um cliente meu queria bloquear automaticamente qualquer pessoa que tentasse se inscrever com um número de telefone dessa grande lista que ele tinha, então era apenas uma grande lista negra.


19

Se houver uma necessidade válida para isso, não vejo nenhum problema. Talvez você queira apenas uma lista de possibilidades para ser exibida por algum motivo e queira poder alterá-la dinamicamente, mas não precisa vinculá-la a outra tabela.


+1 - Resumindo, esta é a resposta certa em meu livro
Mark Brittingham

1 para uma resposta concisa e clara.
Matthew Jones

3
Por que uma tabela de uma coluna não pode ser vinculada a outra tabela?
Aheho

2
Por que não? Veja a tabela de códigos de estado como exemplo. Por que você não usaria isso como uma restrição de chave foriegn em outra tabela com campos de endereço?
Aheho

1
Esse é um ótimo exemplo de uma época em que seria uma boa ideia.
Kevin

11

Um caso que encontrei às vezes é algo assim:

A tabela countries_id contém apenas uma coluna com ID numérico para cada país.

A tabela countries_description contém a coluna com o ID do país, uma coluna com o ID do idioma e uma coluna com o nome do país localizado.

A tabela company_factories , contém informações para cada fábrica da empresa, incluindo o país em que está localizada.

Portanto, para manter a coerência dos dados e os dados independentes do idioma nas tabelas, o banco de dados usa esse esquema com tabelas com apenas uma coluna para permitir chaves estrangeiras sem dependências de idioma.

Neste caso acho que se justifica a existência de tabelas de uma coluna.

Editado em resposta ao comentário de: Quassnoi


(fonte: ggpht.com )

Neste esquema, posso definir uma chave estrangeira na tabela company_factories que não exige que eu inclua a coluna Language na tabela, mas se eu não tiver a tabela countries_id, devo incluir a coluna Language na tabela para definir a chave estrangeira .


2
Por que ter countries_id? Para inserir um país, você precisa saber seu nome em pelo menos um idioma, e isso resultará em um country_id aparecendo em countries_description. Um country_id sem a entrada countries_description não tem sentido. "Sr. Barack Obama, Presidente da COALESCE (14243, country_name) RETURNED NULL VALUE, reuniu-se hoje com Dmitry Medvedev, Presidente de Россия"
Quassnoi

4
@Doliveras: OK, entendo agora, +1. Prefiro usar ISO 3166-1 para coutry_code, no entanto. Ao contrário da identificação numérica, um código de país de 3 letras dá uma ideia de qual país é mencionado para quase todas as pessoas no mundo que podem ler o alfabeto latino.
Quassnoi

Aqui está outra maneira que implementei para acomodar traduções de linguagem natural na mesma tabela. Concedido, muitos campos são anuláveis ​​como resultado, mas você pode transferir a integridade dos dados para gatilhos personalizados. CREATE TABLE "DBA" "myLocalisedTable" ( "entry_id" INTEIRO padrão NÃO NULO AUTOINCREMENT, "master_entry_id" INTEIRO NULL, "master_entry_label" VARCHAR (200) NULL, "language_id" INTEIRO NULL, "localised_entry_label" VARCHAR (300) NULL,.
Vincent Buck

7

Haveria casos raros em que uma tabela de coluna única faria sentido. Fiz um banco de dados em que a lista de códigos de idioma válidos era uma tabela de coluna única usada como chave estrangeira. Não fazia sentido ter uma chave diferente, já que o próprio código era a chave. E não havia uma descrição fixa, uma vez que as descrições do código do idioma variam de acordo com o idioma para alguns contextos.

Em geral, qualquer caso em que você precise de uma lista oficial de valores que não tenham atributos adicionais é um bom candidato para uma tabela de uma coluna.


5

Eu uso tabelas de coluna única o tempo todo - dependendo, é claro, se o design do aplicativo já usa um banco de dados. Depois de suportar a sobrecarga de design de estabelecer uma conexão de banco de dados, coloquei todos os dados mutáveis ​​em tabelas, sempre que possível.

Posso pensar em dois usos para tabelas OTMH de coluna única:

1) Existe item de dados. Freqüentemente usado em listas suspensas. Também usado para testes de legitimidade simples.

Por exemplo. abreviações de duas letras dos estados dos EUA; CEPs para os quais enviamos; palavras legais no Scrabble; etc.

2) Atributo binário esparso, ou seja, em uma grande tabela, um atributo binário que será verdadeiro para apenas alguns registros. Em vez de adicionar uma nova coluna booleana, posso criar uma tabela separada contendo as chaves dos registros para os quais o atributo é verdadeiro.

Por exemplo. funcionários com doença terminal; bancos com um ano de 360 ​​dias (a maioria usa 365); etc.

-Al.



4

Geralmente, já vi isso em tabelas de tipo de pesquisa, como a tabela de estado que você descreveu. No entanto, se você fizer isso, certifique-se de definir a coluna como a chave primária para forçar a exclusividade. Se você não pode definir esse valor como exclusivo, você não deve usar uma coluna.


Embora usar uma única coluna aqui provavelmente seja bom, lembre-se de que você também pode configurar restrições de exclusividade em outras colunas.
Stealth Rabino

2

Eu diria em geral, sim. Não sei por que você precisa de apenas uma coluna. Existem algumas exceções que eu vi serem usadas com eficácia. Depende do que você está tentando alcançar.

Eles não têm um design muito bom quando você está pensando no esquema do banco de dados, mas devem ser usados ​​apenas como tabelas de utilitários.

Já vi tabelas de números usadas com eficácia no passado.


1

O objetivo de um banco de dados é relacionar informações entre si. Como você pode fazer isso quando não há dados com os quais se relacionar?

Talvez seja algum tipo de tabela de compilação (ou seja, Nome + Sobrenome + Data de nascimento), embora eu ainda não saiba por que você deseja fazer isso.

EDIT: Eu poderia ver usando este tipo de tabela para uma lista simples de algum tipo. É para isso que você está usando?


9
Não, o objetivo principal de um banco de dados é armazenar informações.
Spencer Ruport

Mas uma planilha pode armazenar informações. E como a informação é útil se for apenas um monte de números e letras desconexos sem correlação entre eles?
Matthew Jones

As informações podem ser úteis porque o aplicativo que usa o banco de dados precisa delas e não é um conjunto fixo. Ou seja, o banco de dados é simplesmente o local mais conveniente para colocar informações a serem usadas por um aplicativo de banco de dados - relacional ou não. Tenho certeza de que você concorda que não estamos construindo aplicativos para provar nossa pureza em relação ao ideal relacional. Em vez disso, criamos aplicativos para serem úteis.
Mark Brittingham

@Mark - Isso é o que quero dizer com uma lista simples. Acho que não me expliquei muito bem.
Matthew Jones

1
@SR - Não, o objetivo principal de um banco de dados é recuperar informações. Como as linhas de interesse mais frequentemente do que não dependem de outros dados, acho que o comentário original de MJ se mantém.
CurtainDog

1

Sim, desde que o campo seja a chave primária como você disse que seria. A razão é porque, se você inserir dados duplicados, essas linhas serão somente leitura. Se você tentar excluir uma das linhas que estão duplicadas. não funcionará porque o servidor não saberá qual linha excluir.


2
Isso é ridículo. Uma operação de exclusão sem uma chave primária ou restrição excluirá todas as linhas correspondentes, não as ignorará.
Erik Funkenbusch

1
Por 'não funciona', ele pode significar "não funciona como esperado", que abrange a condição "ei, excluí uma linha, mas ambas se foram".
GWLlosa

Ou, se você tentar excluir um registro no SSMS da visualização "Tabela aberta", será exibida uma caixa de diálogo informando que o registro não pode ser identificado exclusivamente e não fará nada ...
Michael Fredrickson

-1

O único caso de uso que posso conceber é uma mesa de palavras, talvez para um jogo de palavras. Você acessa a tabela apenas para verificar se uma string é uma palavra: selecione a palavra das palavras em que palavra =?. Mas existem estruturas de dados muito melhores para manter uma lista de palavras do que um banco de dados relacional .

Caso contrário, os dados em um banco de dados geralmente são colocados em um banco de dados para tirar proveito dos relacionamentos entre os vários atributos dos dados. Se seus dados não possuem atributos além de seu valor, como essas relações serão desenvolvidas?

Portanto, embora não seja ilegal, em geral você provavelmente não deve ter uma tabela com apenas uma coluna.


Semelhante a esta é a tabela de números que é muito útil para interromper o loop.
u07ch

-1

Todas as minhas tabelas têm pelo menos quatro campos de tecnologia, chave primária serial, timestamps de criação e modificação e booleano de exclusão reversível. Em qualquer lista negra, você também desejará saber quem adicionou a entrada. Portanto, para mim, a resposta é não, uma tabela com apenas uma coluna não faria sentido, exceto ao prototipar algo.


1
Parece que você está misturando uma tabela de dados com uma tabela de transações. Na minha opinião, devem ser duas coisas distintas.
Josh Noe

-2

Sim, está perfeitamente bem. mas um campo de ID não poderia machucar certo?


7
Na verdade, pode. Quando você tem uma lista definitiva de valores válidos, a última coisa que você quer é um campo de ID, pois isso implica que os valores não são únicos. Se 'LightBlue' é uma chave, então você não quer que alguém pense que 'LightBlue' com id 1 pode ser diferente de 'LightBlue' com id 4.
Jeremy Bourque

Quem disse que o Id tem que ser identidade? Ou parte da chave?
Eric

3
Pode ser uma chave sintética e o campo original pode ter uma restrição exclusiva.
Mark Canlas
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.