118 votes

Un tableau à une colonne est-il bien conçu ?

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

EDIT :

Voici quelques exemples :

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

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

0 votes

J'ai un peu de mal à imaginer un cas d'utilisation pour un tableau ne comportant qu'une seule colonne. Pouvez-vous me donner un exemple ?

0 votes

Mais au moins ne créez pas d'index pour cela !

3 votes

Les codes des États américains sont un exemple classique de définition d'un domaine.

173voto

Quassnoi Points 191041

En termes de relational algebra il s'agirait d'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 devraient être des clés primaires naturelles, bien sûr.

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

3 votes

+1 : La table est un ensemble de valeurs qui se trouvent être des types primitifs de votre SGBDR.

5 votes

+1 pour avoir fourni une réponse basée sur la théorie relationnelle.

0 votes

Voici un bon exemple de schéma comportant une table à une colonne qui n'est pas une clé naturelle, la table Thread dans un système de messagerie... stackoverflow.com/a/6542556/45767

95voto

Erik Funkenbusch Points 53436

Oui, c'est certainement une bonne conception que de concevoir une table de manière à la rendre la plus efficace possible. La "mauvaise conception du SGBDR" est généralement centrée sur l'inefficacité.

Cependant, j'ai constaté que la plupart des cas de conception à une seule colonne pourraient bénéficier d'une colonne supplémentaire. Par exemple, pour les codes d'État, le nom complet de l'État peut être épelé dans une deuxième colonne. Ou une liste noire peut être associée à des notes. Mais, si votre conception n'a pas vraiment besoin de ces informations, il est tout à fait acceptable d'avoir une seule colonne.

0 votes

Cette réponse était très utile. Je trouve étrange que ce fil ait été fermé parce qu'il était trop "fondé sur des opinions" alors que cette réponse (et celle qui la suit) démontre très clairement qu'il est possible d'y répondre de manière suffisamment factuelle.

30voto

Spencer Ruport Points 24589

Je les ai utilisés dans le passé. Un de mes clients voulait bloquer automatiquement toute personne tentant de s'inscrire avec un numéro de téléphone figurant dans la grande liste qu'il avait établie pour qu'il n'y ait qu'une seule grande liste noire.

19voto

Kevin Points 2548

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

0 votes

+1 - En résumé, c'est la bonne réponse dans mon livre.

0 votes

+1 pour une réponse concise et claire.

3 votes

Pourquoi un tableau à une colonne ne peut-il pas être lié à un autre tableau ?

12voto

Doliveras Points 1085

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

Tableau pays_id contient une seule colonne avec un ID numérique pour chaque pays.

Tableau pays_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é.

Tableau entreprises_usines contient des informations pour chaque usine de l'entreprise, y compris le pays dans lequel elle est située.

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

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

Modifié en réponse au commentaire de : Quassnoi


(source : <a href="http://lh5.ggpht.com/_7ON9I_WO6GU/SikFHBtzcxI/AAAAAAAAA-4/6MrVUCHGoWU/s800/taules.png" rel="nofollow noreferrer">ggpht.com </a>)

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

2 votes

Pourquoi avoir des pays_id ? Pour insérer un pays, vous devez connaître son nom dans au moins une langue, ce qui se traduira par un country_id apparaissant dans countries_description. Un country_id sans entrée countries_description n'a aucun sens. "M. Barack Obama, président de COALESCE(14243, country_name) RETURNED NULL VALUE, a rencontré aujourd'hui Dmitry Medvedev, président de "

4 votes

@Doliveras : OK, je vois maintenant, +1. Je préférerais cependant utiliser l'ISO 3166-1 pour le coutry_code. Contrairement à l'identification numérique, un code pays à 3 lettres donne une idée du pays mentionné à presque tout le monde dans le monde qui peut lire l'alphabet latin.

0 votes

Voici un autre moyen que j'ai mis en œuvre pour permettre les traductions en langage naturel dans la même table. Bien sûr, de nombreux champs peuvent être annulés, mais vous pouvez confier l'intégrité des données à des déclencheurs personnalisés. CREATE TABLE "DBA". "myLocalisedTable" ("entry_id" INTEGER NOT NULL DEFAULT AUTOINCREMENT, "master_entry_id" INTEGER NULL, "master_entry_label" VARCHAR(200) NULL, "language_id" INTEGER NULL, "localised_entry_label" VARCHAR(300) NULL,

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X