2009-08-19 4 views
1

Je crée une structure de base de données pour un nouveau projet et il y a une table dont l'un des champs recevra/contiendra une des trois valeurs lors de la sélection d'une boîte de sélection sur le site Web. les valeurs seraient (ouvertes, suspendues, fermées) serait-il nécessaire de faire le champ de type varchar (une certaine valeur) ou existe-t-il une meilleure façon de le faire? aussi d'autres fois mal avoir un champ qui acceptera l'une des deux valeurs qui sont un oui ou un non et je règle habituellement juste le champ de type varchar (3). je veux le faire de la bonne façon quels autres types puis-je définir le champ pour ces types d'instances?si une table de bases de données mysql va contenir deux à quatre valeurs dois-je utiliser un varchar?

grâce

ps:

ce qui est le but de définir un champ non nul lors de la création des colonnes dans un tableau? Tout ce qu'il fait est montrer une erreur lorsque le développeur ne pas insérer une valeur pour un champ qui est requis. Tout ce contrôle peut être fait côté client ou côté serveur, quel est son but à travers la base de données? est-ce juste là pour rendre les développeurs attentifs aux champs requis pour la saisie des données?

Répondre

6

Vérifiez le type enum. Il vous permet d'avoir un certain nombre d'options, et est normalement plus efficace à cause de cela.

2

Idéalement, je devrais en fait un champ entier il y a ce qui est une clé étrangère à une autre table, quelque chose comme:

MyTable 
    Field1 varchar(10) 
    State integer 

States 
    State integer primary key 
    Desc varchar(50) 

Cela permettra d'atténuer toute préoccupation que vous pourriez avoir à l'utilisation trop de place dans votre DB . Une autre solution consiste à utiliser des entiers codés en dur pour spécifier l'état, mais cela introduit des liens inutiles entre votre base de données et votre application. En ce qui concerne votre question sur l'utilisation de "not null", le SGBD devrait être uniquement responsable de sa propre intégrité des données. Qui peut dire que l'application A s'appuie sur le fait qu'une colonne ne peut pas contenir de NULL et que l'application B arrive et les insère (bug, codeur incompétent ou toute autre raison)?

Cela pourrait potentiellement casser l'application A. Le bon endroit pour contrôler quelles données se trouvent dans le SGBD se trouve dans le SGBD.

+0

+1 pour couvrir les valeurs nulles. – nilamo

+0

fait mauvais sens garder cela à l'esprit. thanx –

+0

J'utilise de plus en plus cette technique et j'utilise de moins en moins d'enumérations, à mesure que j'apprends (à la dure) que les applications doivent être flexibles. –

0

ENUM('opened', 'suspended', 'closed')

+0

Comment sélectionner les valeurs à afficher dans la zone de sélection? et si une sélection d'ouvert est sélectionnée par le menu déroulant serait-il juste une sauvegarde régulière telle que "insérer dans les valeurs de tablename (...)) –

0

J'utilise habituellement ENUM dans ces cas.

PS - NULL est une valeur différente de vide

+0

alors quel est son but? –

+0

@iaddesign, NULL signifie spécifiquement inconnu ou non applicable.Ceci est différent de "connu/applicable mais vide" – paxdiablo

1

TINYINT unsigned est généralement un meilleur type de champ pour cela, bien que ENUM est une possibilité. J'ai tendance à éviter ENUM parce que c'est un peu compliqué de déployer une nouvelle valeur dans votre code si vous devez également mettre des changements dans la base de données. Un TINYINT prend seulement un seul octet de stockage, et peut représenter jusqu'à 256 valeurs différentes, par opposition à stocker un varchar de 'suspendu', qui occupe 9 octets, plus un octet de préfixe. Dans ce cas, j'utiliserais 0, 1 et 2 pour représenter 'ouvert', 'suspendu' et 'fermé' respectivement. Encore une fois, ENUM vous permet d'utiliser la représentation textuelle plutôt que l'entier, mais nécessite un changement de colonne si vous souhaitez ajouter une nouvelle valeur.

En ce qui concerne vos questions sur NOT NULL, oui, c'est une méthode utilisée pour aider à assurer l'intégrité des données.Il est étonnamment utile si vous avez la prévoyance de le faire partie de vos structures de table.

+0

a un sens, oui j'ai un problème avec la compréhension de la façon dont fonctionne enum si j'ai 3 valeurs spécifiées comment serais-je regarder ces données sur le côté client, ainsi que la mise à jour de la table en fonction de ce que l'utilisateur a sélectionné dans la liste déroulante –

+0

ENUM est simplement stocké en tant qu'int, mais les ints sont représentés en tant que texte, donc au lieu de faire INSERT INTO tbl VALUES (0) ' Dans la colonne TINYINT, vous feriez INSERT INTO tbl VALUES ('open') 'pour l'ENUM.Si vous le sélectionnez dans la base de données, vous obtenez également la chaîne 'open' .En interne, MySQL stocke simplement les valeurs enum possibles comme ints, ce qui économise sur les données s espace de stockage. L'inconvénient est que vous ne pouvez utiliser que les valeurs dans la déclaration de la colonne. – zombat

+0

je pense que je vais juste coller à l'aide tinyint je ne vois pas vraiment un but à enums avec l'application im bâtiment. la base de données ne sera pas plus grande que 20 mbs (à long terme) je me demande quelle est la taille maximale d'un db mysql peut être .. hmm ... –

Questions connexes