web-dev-qa-db-fra.com

Stockage du sexe (genre) dans la base de données

Je souhaite stocker le sexe d'un utilisateur dans une base de données avec un coût aussi faible que possible (taille/performances).

Jusqu'à présent, 3 scénarios viennent à l'esprit

  1. Int - aligné avec Énum dans le code (1 = Homme, 2 = Femme, 3 = ...)
  2. char (1) - Stocker m , f ou un autre identificateur à caractère unique
  3. Bit (booléen) - existe-t-il un nom de champ approprié pour cette option? =

La raison pour laquelle je pose cette question est à cause de ceci réponse qui mentionne que les caractères sont plus petits que booléens .

Je devrais préciser que j'utilise MS SQL 2008, qui [~ # ~] a [~ # ~] en fait le type de données bit.

126
Marko

J'appellerais la colonne "genre".

Data Type   Bytes Taken          Number/Range of Values
------------------------------------------------
TinyINT     1                    255 (zero to 255)
INT         4            -       2,147,483,648 to 2,147,483,647
BIT         1 (2 if 9+ columns)  2 (0 and 1)
CHAR(1)     1                    26 if case insensitive, 52 otherwise

Le type de données BIT peut être exclu car il ne prend en charge que deux genres possibles, ce qui est insuffisant. Alors que INT prend en charge plus de deux options, il faut 4 octets - les performances seront meilleures avec un type de données plus petit/plus étroit.

CHAR(1) a Edge over TinyINT - les deux prennent le même nombre d'octets, mais CHAR fournit un nombre plus étroit de valeurs. Utiliser CHAR(1) ferait en utilisant "m", "f", etc. clés naturelles, par opposition à l'utilisation de données numériques qui sont appelées clés de substitution/artificielles. CHAR(1) est également supporté par toute base de données, si un portage est nécessaire.

Conclusion

Je voudrais utiliser l'option 2: CHAR (1).

Addenda

Un index sur la colonne de genre aiderait probablement pas car il n'y a pas de valeur dans un index sur une colonne à faible cardinalité. Cela signifie que les valeurs de l'index ne sont pas assez variées pour fournir une valeur quelconque.

74
OMG Ponies

Il existe déjà une norme ISO pour cela; pas besoin d'inventer votre propre schéma:

http://en.wikipedia.org/wiki/ISO_5218

Selon la norme, la colonne devrait s'appeler "Sexe" et le type de données "le plus proche" serait "tinyint" avec une contrainte CHECK ou une table de correspondance, selon le cas.

167
Pondlife

En médecine, il existe quatre genres: masculin, féminin, indéterminé et inconnu. Vous n’avez peut-être pas besoin des quatre, mais vous avez certainement besoin de 1, 2 et 4. Il n’est pas approprié d’avoir une valeur par défaut pour ce type de données. Encore moins de le traiter comme un booléen avec les états "est" et "n'est pas".

40
user207421

J'utilise char 'f', 'm' et 'u' parce que je présume que le sexe est déterminé par le nom, la voix et la conversation et que, parfois, je ne connais pas le genre. La détermination finale est leur opinion.

Cela dépend vraiment de votre connaissance de la personne et de vos critères de forme physique ou d'identité personnelle. Un psychologue peut avoir besoin d'options supplémentaires - passer d'une femme à l'autre, d'un homme à l'autre, d'un homme à un autre, d'un homme à l'autre, d'un hermaphrodite et d'un indécis. Avec 9 options, pas clairement définies par un seul caractère, je pourrais aller avec le conseil de Hugo de petit entier.

3
zarac

Ma Int (ou TinyInt) alignée sur un champ Enum serait ma méthodologie.

Premièrement, si vous avez un seul champ bit dans une base de données, la ligne utilisera toujours un octet complet. Par conséquent, en termes d'économies d'espace, cela ne sera rentable que si vous avez plusieurs champs bit.

Deuxièmement, les chaînes/caractères ont une "valeur magique", quelle que soit leur apparence évidente au moment de la conception. Sans parler de cela, il permet aux gens de stocker à peu près n'importe quelle valeur qu'ils n'auraient pas nécessairement associée à quelque chose d'évident.

Troisièmement, une valeur numérique est beaucoup plus facile (et meilleure pratique) de créer une table de consultation afin de mettre en œuvre l’intégrité référentielle, et peut corréler 1 à 1 avec une énumération. Il existe donc une parité dans le stockage de la valeur en mémoire dans l'application ou dans la base de données.

3
Hugo

L'option 3 est votre meilleur choix, mais tous les moteurs de base de données n'ont pas un type "bit". Si vous n'en avez pas, TinyINT serait votre meilleur pari.

1
ajacian81