138 votes

Stocker le sexe dans la base de données

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

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

  1. Int - aligné avec Enum dans le code (1 = Masculin, 2 = Féminin, 3 = ...)
  2. char(1) - Stockez m, f ou un autre identifiant à un seul caractère
  3. Bit (booléen) - y a-t-il un nom de champ approprié pour cette option?

La raison pour laquelle je pose cette question est due à cette réponse qui mentionne que les chars sont plus petits que les booléens.

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

1 votes

FWIW, la question SO à laquelle vous avez fait référence concerne la façon dont .NET représente ces types en mémoire. Cela n'a rien à voir avec la façon dont SQL Server les représente. bit <= char. msdn.microsoft.com/en-us/library/ms177603.aspx

1 votes

Quel est l'usage du champ de genre ? Est-ce qu'il pourrait simplement s'agir d'une chaîne de caractères, afin que les gens puissent entrer ce qu'ils veulent ? Essayer de lister toutes les réponses possibles à cette question va être difficile.

0 votes

@ThePassenger: Je pense que l'option habituelle est en gros m/f/autre, donc oui ternaire comme vous le suggérez est bien. Vous voudrez peut-être distinguer "autre" de "non spécifié" (comme dans "Je ne dis rien", et/ou "nous n'avons pas encore demandé à l'utilisateur"). Je ne suis pas au courant de personnes de genre fluide voulant une valeur à virgule flottante avec un curseur qu'ils peuvent régler chaque jour; je suppose que la plupart d'entre eux (et d'autres personnes de genre non traditionnel) seraient heureux de simplement choisir "autre" ou "non spécifié" sur presque n'importe quel site web. Mais non, je ne pense pas que demander "sexe" au lieu de "genre" serait une bonne idée.

186voto

Pondlife Points 10490

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

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

Conformément à la norme, la colonne devrait s'appeler "Sexe" et le type de données le plus approprié serait tinyint avec une contrainte CHECK ou une table de recherche selon le cas.

4 votes

Pourquoi passe-t-il à 9 pour 'non applicable'? Et que dire de 3-8?

4 votes

Ceci concerne le sexe. OP a spécifiquement demandé le genre. Le sexe et le genre ont probablement des valeurs différentes qui peuvent nécessiter d'être capturées.

3 votes

@indigochild L'OP utilise les deux mots dans le titre de la question et les considère clairement comme équivalents, du moins pour son cas d'utilisation (votre expérience peut varier). Mon point est simplement qu'il existe une norme ISO dans ce domaine et que vous ne devriez jamais perdre du temps à concevoir votre propre schéma lorsque qu'une norme officielle existe. À moins bien sûr que cette norme ne couvre pas votre cas particulier, ce qui est tout à fait possible.

88voto

OMG Ponies Points 144785

Je nommerais la colonne "genre".

Type de donnée   Octets utilisés          Nombre/Gamme de valeurs
------------------------------------------------
TinyINT          1                       255 (zéro à 255)
INT              4               -       2 147 483 648 à 2 147 483 647
BIT              1 (2 si 9+ colonnes)    2 (0 et 1)
CHAR(1)          1                       26 si insensible à la casse, 52 sinon

Le type de donnée BIT peut être écarté car il ne prend en charge que deux genres possibles, ce qui est insuffisant. Alors que le INT prend en charge plus de deux options, mais il prend 4 octets -- la performance sera meilleure avec un type de donnée plus petit/plus étroit.

CHAR(1) a l'avantage sur le TinyINT - les deux prennent le même nombre d'octets, mais CHAR fournit un nombre plus restreint de valeurs. L'utilisation de CHAR(1) permettrait d'utiliser des clés naturelles telles que "m", "f", etc, au lieu de l'utilisation de données numériques appelées clés de substitution/artificielles. De plus, CHAR(1) est pris en charge sur n'importe quelle base de données, s'il est nécessaire de migrer.

Conclusion

Je choisirais l'option 2 : CHAR(1).

Addendum

Un index sur la colonne du genre ne serait probablement pas utile car il n'y a aucune valeur dans un index sur une colonne de faible cardinalité. Autrement dit, il n'y a pas suffisamment de variété dans les valeurs pour que l'index apporte une quelconque valeur ajoutée.

0 votes

Avez-vous des références en matière de performances ? Je sais que c'est presque de la micro-optimisation que je ne devrais pas faire, mais c'est nourriture pour mon esprit curieux.

0 votes

Merci @OMG Ponies, qu'en est-il des performances? Est-ce qu'un char serait plus coûteux qu'un bit dans ce cas?

4 votes

@Marko: Comme je l'ai déjà dit, ils sont égaux. Mais un index ne serait probablement pas utile car il n'y a aucune valeur dans un index sur une colonne à faible cardinalité. Cela signifie qu'il n'y a pas assez de variété dans les valeurs pour que l'index apporte une quelconque valeur.

43voto

EJP Points 113412

En médecine, il y a quatre genres : masculin, féminin, indéterminé et inconnu. Vous pourriez ne pas avoir besoin des quatre, mais vous avez certainement besoin du 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 des états 'est' et 'n'est pas'.

1 votes

@EJP, intéressant. Avez-vous une référence à cela?

0 votes

En se basant sur cette information, je choisirais TinyInt aligné avec un enum (tel que suggéré par Hugo) et choisirais au moins 1, 2 et 3 (Autre).

1 votes

@EJP, bien que votre réponse soit probablement correcte, elle ne précise PAS quel type de données je devrais utiliser, mais plutôt - quels sont les genres (techniquement) corrects.

1voto

Andrew Barber Points 25990

Je pense que la solution 3 semble la méthode la plus directe. Vous pourriez toujours le nommer IsFemale si vous préférez :p

0voto

zarac Points 11

J'utilise les caractères 'f', 'm' et 'i' car je déduis le genre à partir du nom, de la voix et de la conversation, et parfois je ne connais pas le genre. La détermination finale est leur opinion.

Cela dépend vraiment de la connaissance que vous avez de la personne et que vos critères soient la forme physique ou l'identité personnelle. Un psychologue pourrait avoir besoin d'options supplémentaires - trans à féminin, trans à masculin, transgenre à féminin, transgenre à masculin, hermaphrodite et indécis. Avec 9 options, pas clairement définies par un seul caractère, je pourrais suivre le conseil de Hugo et opter pour un petit entier.

0 votes

Pas sur le sujet. Ce n'est pas une réponse.

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