Une table à une colonne est-elle bien conçue? [fermé]

111

Est-il acceptable d'avoir une table avec une seule colonne? Je sais que ce n'est pas techniquement illégal, mais est-ce considéré comme une mauvaise conception?

ÉDITER:

Voici quelques exemples:

  • Vous avez une table avec les 50 codes d'état américains valides, mais vous n'avez pas besoin de stocker les noms d'états détaillés.
  • Une liste noire d'e-mails.

Quelqu'un a mentionné l'ajout d'un champ clé. La façon dont je le vois, cette seule colonne SERAIT la clé primaire.

Aheho
la source
J'ai un peu de mal à imaginer un cas d'utilisation pour une table avec une seule colonne. Pouvez-vous donner un exemple?
Paul Morie
mais au moins ne créez pas d'index pour cela!
Sathya le
3
Les codes d'État américains sont un exemple classique de définition d'un domaine
Quassnoi
3
J'ai déjà vu une table de base de données utilisée pour contenir une valeur de verrouillage pour une application
Russ Cam
Mon utilisation pour ce modèle était de créer des ensembles de données. Chaque enregistrement de la table principale a un champ SET. Les enregistrements avec le même SET sont connectés. Comment insérer plusieurs enregistrements avec le même SET? «INSERT INTO sets VALUES ()», puis utilisez le dernier ID d'insertion comme ID SET pour attacher aux enregistrements. Là encore, j'aurais peut-être pu utiliser des UUID, mais quelque chose ne va pas à ce sujet.
William Entriken le

Réponses:

87

Oui, c'est certainement une bonne conception de concevoir une table de manière à la rendre plus efficace. «Bad RDBMS Design» est généralement centré sur l'inefficacité.

Cependant, j'ai constaté que la plupart des cas de conception à colonne unique pourraient bénéficier d'une colonne supplémentaire. Par exemple, les codes d'état peuvent généralement avoir le nom complet de l'état dans une deuxième colonne. Ou une liste noire peut avoir des notes associées. Mais, si votre conception n'a vraiment pas besoin de ces informations, alors il est parfaitement normal d'avoir une seule colonne.

Erik Funkenbusch
la source
168

En termes de relational algebraceci serait une relation unaire, signifiant " cette chose existe "

Oui, c'est bien d'avoir une table définissant une telle relation: par exemple, pour définir un domaine.

Les valeurs d'une telle table doivent bien entendu être des clés primaires naturelles.

Une table de consultation de prime numbersest ce qui me vient à l'esprit en premier.

Quassnoi
la source
3
+1: Le tableau est un ensemble de valeurs qui se trouvent être des types primitifs de votre SGBDR.
S.Lott
4
+1 pour fournir une réponse basée sur la théorie relationnelle.
lubos hasko le
Voici un bon exemple de schéma qui a une table à 1 colonne qui n'est pas une clé naturelle, la table Thread dans un système de messagerie ... stackoverflow.com/a/6542556/45767
JeremyWeir
29

Je les ai utilisés dans le passé. Un de mes clients voulait bloquer automatiquement toute personne essayant de s'inscrire avec un numéro de téléphone dans cette grande liste qu'il avait donc c'était juste une grande liste noire.

Spencer Ruport
la source
19

S'il y a un besoin valable, je ne vois pas de problème. Peut-être que vous voulez juste une liste de possibilités à afficher pour une raison quelconque et que vous voulez pouvoir la changer dynamiquement, mais n'avez pas besoin de la lier à une autre table.

Kevin
la source
+1 - En bout de ligne, c'est la bonne réponse dans mon livre
Mark Brittingham
+1 pour une réponse claire et concise.
Matthew Jones
3
Pourquoi une table à une colonne ne peut-elle pas être liée à une autre table?
Aheho
2
Pourquoi pas? Prenons la table des codes d'état comme exemple. Pourquoi ne pas utiliser cela comme une contrainte de clé étrangère contre une autre table avec des champs d'adresse?
Aheho
1
C'est un excellent exemple d'une époque où ce serait une bonne idée.
Kevin
11

Un cas que j'ai trouvé parfois est quelque chose comme ceci:

La table country_id , contient une seule colonne avec un identifiant numérique pour chaque pays.

La table country_description contient la colonne avec l'ID du pays, une colonne avec l'ID de la langue et une colonne avec le nom du pays localisé.

Le tableau company_factories contient des informations pour chaque usine de l'entreprise, y compris le pays dans lequel se trouve.

Ainsi, pour maintenir la cohérence des données et les données indépendantes de la langue dans les tables, la base de données utilise ce schéma avec des tables avec une seule colonne pour autoriser les clés étrangères sans dépendances linguistiques.

Dans ce cas, je pense que l'existence de tables à une colonne est justifiée.

Édité en réponse au commentaire de: Quassnoi


(source: ggpht.com )

Dans ce schéma, je peux définir une clé étrangère dans la table company_factories qui ne m'oblige pas à inclure la colonne Language sur la table, mais si je n'ai pas la table country_id, je dois inclure la colonne Language sur la table pour définir la clé étrangère .

Doliveras
la source
2
Pourquoi avoir country_id? Pour insérer un pays, vous devez connaître son nom dans au moins une langue, ce qui entraînera l'apparition d'un country_id dans countries_description. Un country_id sans entrée country_description n'a pas de sens. "M. Barack Obama, président de COALESCE (14243, nom_pays) a rendu une valeur nulle, a rencontré aujourd'hui Dmitri Medvedev, président de Россия"
Quassnoi
4
@Doliveras: OK, je vois maintenant, +1. Je préfère cependant utiliser ISO 3166-1 pour coutry_code. Contrairement à l'identifiant numérique, un code de pays à 3 lettres donne une idée du pays mentionné à presque tout le monde dans le monde qui sait lire l'alphabet latin.
Quassnoi
Voici une autre façon que j'ai mise en œuvre pour intégrer les traductions en langage naturel dans le même tableau. Certes, de nombreux champs peuvent être annulés, mais vous pouvez décharger l'intégrité des données vers des déclencheurs personnalisés. CREATE TABLE "DBA" "myLocalisedTable" ( "entry_id" INTEGER NOT NULL DEFAULT AUTOINCREMENT, "master_entry_id" ENTIER NULL, "master_entry_label" VARCHAR (200) NULL, "LANGUAGE_ID" ENTIER NULL, "localised_entry_label" VARCHAR (300) NULL,.
Vincent Buck
7

Il y aurait de rares cas où une table à une seule colonne aurait du sens. J'ai fait une base de données où la liste des codes de langue valides était une table à une seule colonne utilisée comme clé étrangère. Il était inutile d'avoir une clé différente, puisque le code lui-même était la clé. Et il n'y avait pas de description fixe puisque les descriptions des codes de langue variaient selon la langue pour certains contextes.

En général, tous les cas où vous avez besoin d'une liste de valeurs faisant autorité qui n'ont aucun attribut supplémentaire est un bon candidat pour une table à une colonne.

Jérémy Bourque
la source
5

J'utilise tout le temps des tables à une seule colonne - selon, bien sûr, si la conception de l'application utilise déjà une base de données. Une fois que j'ai supporté la surcharge de conception liée à l'établissement d'une connexion à une base de données, je place toutes les données mutables dans des tables lorsque cela est possible.

Je peux penser à deux utilisations des tables à une seule colonne OTMH:

1) L'élément de données existe. Souvent utilisé dans les listes déroulantes. Également utilisé pour des tests de légitimité simples.

Par exemple. abréviations des États américains à deux lettres; Codes postaux vers lesquels nous expédions; mots légaux au Scrabble; etc.

2) Attribut binaire épars, c'est-à-dire, dans une grande table, un attribut binaire qui ne sera vrai que pour un très petit nombre d'enregistrements. Au lieu d'ajouter une nouvelle colonne booléenne, je pourrais créer une table séparée contenant les clés des enregistrements pour lesquels l'attribut est vrai.

Par exemple. les employés qui ont une maladie terminale; les banques avec une année de 360 ​​jours (la plupart utilisent 365); etc.

-Al.

AI Breveleri
la source
4

Aucun problème tant qu'il contient des valeurs uniques.

Agnel Kurian
la source
4

La plupart du temps, j'ai vu cela dans les tables de type de recherche telles que la table d'état que vous avez décrite. Cependant, si vous faites cela, assurez-vous de définir la colonne comme clé primaire pour forcer l'unicité. Si vous ne pouvez pas définir cette valeur comme unique, vous ne devriez pas utiliser une seule colonne.

HLGEM
la source
Bien qu'utiliser une seule colonne ici soit probablement très bien, gardez à l'esprit que vous pouvez également définir des contraintes d'unicité sur d'autres colonnes.
Stealth Rabbi
2

Je dirais en général, oui. Je ne sais pas pourquoi vous n'avez besoin que d'une seule colonne. Il y a quelques exceptions à cela que j'ai vues utilisées efficacement. Cela dépend de ce que vous essayez d'accomplir.

Ils ne sont pas vraiment de bonne conception lorsque vous pensez au schéma de la base de données, mais ne devraient vraiment être utilisés que comme tables utilitaires.

J'ai vu des tableaux de nombres utilisés efficacement dans le passé.

Brendan Enrick
la source
1

Le but d'une base de données est de relier des éléments d'information les uns aux autres. Comment pouvez-vous faire cela quand il n'y a pas de données à relier?

C'est peut-être une sorte de table de compilation (c'est-à-dire Prénom + Nom + Date de naissance), même si je ne sais toujours pas pourquoi vous voudriez faire cela.

EDIT: Je pourrais voir utiliser ce type de tableau pour une simple liste d'une sorte. Est-ce pour cela que vous l'utilisez?

Matthew Jones
la source
9
Non, l'objectif principal d'une base de données est de stocker des informations.
Spencer Ruport
Mais une feuille de calcul peut stocker des informations. Et en quoi l'information est-elle utile s'il ne s'agit que d'un ensemble de chiffres et de lettres disjoints sans corrélation entre eux?
Matthew Jones
Les informations peuvent être utiles car l'application utilisant la base de données en a besoin et ce n'est pas un ensemble fixe. Autrement dit, la base de données est tout simplement l' endroit le plus pratique pour placer les informations à utiliser par une application de base de données - relationnelle ou autre. Je suis presque sûr que vous conviendrez que nous ne construisons pas d'applications pour prouver notre pureté par rapport à l'idéal relationnel. Au lieu de cela, nous créons des applications pour être utiles.
Mark Brittingham le
@Mark - C'est ce que je voulais dire par une simple liste. Je suppose que je ne me suis pas très bien expliqué.
Matthew Jones
1
@SR - Non, le but principal d'une base de données est de récupérer des informations. Comme les lignes d'intérêt dépendent le plus souvent d'autres éléments de données, je pense que le commentaire original de MJ tient.
CurtainDog
1

Oui tant que le champ est la clé primaire comme vous l'avez dit. La raison en est que si vous insérez des données en double, ces lignes seront en lecture seule. Si vous essayez de supprimer l'une des lignes dupliquées. cela ne fonctionnera pas car le serveur ne saura pas quelle ligne supprimer.

Eric
la source
2
C'est ridicule. Une opération de suppression sans clé primaire ni contrainte va supprimer toutes les lignes correspondantes, pas les ignorer.
Erik Funkenbusch le
1
Par «ne fonctionne pas», il pourrait signifier «ne fonctionne pas comme prévu», qui couvre la condition «hé, j'ai supprimé une ligne mais les deux sont partis».
GWLlosa
Ou, si vous essayez de supprimer un enregistrement dans SSMS de la vue "Open Table", cela affichera en fait une boîte de dialogue indiquant que l'enregistrement ne peut pas être identifié de manière unique et ne fera rien ...
Michael Fredrickson
-1

Le seul cas d'utilisation que je puisse concevoir est une table de mots peut-être pour un jeu de mots. Vous accédez au tableau juste pour vérifier qu'une chaîne est un mot: sélectionnez le mot parmi les mots où mot =?. Mais il existe de bien meilleures structures de données pour contenir une liste de mots qu'une base de données relationnelle .

Sinon, les données d'une base de données sont généralement placées dans une base de données pour tirer parti des relations entre divers attributs des données. Si vos données n'ont pas d'attributs au-delà de leur valeur, comment ces relations seront-elles développées?

Donc, bien que ce ne soit pas illégal, en général, vous ne devriez probablement pas avoir de table avec une seule colonne.

jmucchiello
la source
Similaire à ceci est le tableau des nombres qui est très pratique pour arrêter la boucle.
u07ch
-1

Toutes mes tables ont au moins quatre champs techniques, une clé primaire série, des horodatages de création et de modification et un booléen de suppression logicielle. Dans n'importe quelle liste noire, vous voudrez également savoir qui a ajouté l'entrée. Donc pour moi, la réponse est non, une table avec une seule colonne n'aurait pas de sens sauf lors du prototypage de quelque chose.


la source
1
On dirait que vous mélangez une table de données avec une table de transactions. À mon avis, ce devrait être deux choses distinctes.
Josh Noe
-2

Oui, c'est parfaitement bien. mais un champ d'identification ne pouvait pas nuire, non?

Eric
la source
7
En fait, c'est possible. Lorsque vous avez une liste définitive de valeurs valides, la dernière chose que vous voulez est un champ ID car cela implique que les valeurs ne sont pas uniques. Si «LightBlue» est une clé, alors vous ne voulez pas que quelqu'un pense que «LightBlue» avec l'ID 1 pourrait être différent de «LightBlue» avec l'ID 4.
Jeremy Bourque
Qui a dit que l'Id doit être une identité? Ou une partie de la clé?
Eric le
3
Il peut s'agir d'une clé synthétique et le champ d'origine peut avoir une contrainte unique.
Mark Canlas le