2010-12-13 6 views
2

Disons que j'ai une table avec des annonces immobilières. Chaque liste peut être «À vendre» ou «À louer». Par conséquent, je peux mapper «À vendre» à 0, «À louer» à 1 et le stocker comme INT dans la base de données. Cependant, il serait beaucoup plus descriptif si je le stocke comme «vente»/«location» dans un champ de type CHAR. Ou je peux mapper 0 et 1 à deux constantes FOR_SALE et FOR_RENT dans mon programme. Ou utilisez les caractères 'S' et 'R'. Quelles sont les meilleures pratiques pour stocker ces propriétés dans une base de données avec une condition que le nombre total d'options pour une telle propriété est très faible.Entier vs char pour la propriété d'enregistrement DB

+3

est-il pas la possibilité que quelque chose pourrait être À vendre et à louer en même temps? – Adam

+0

@adam, c'est souvent le cas selon les agents immobiliers que je connais. – HLGEM

+0

Système de base de données? – DeaconDesperado

Répondre

1

Vous devez utiliser un char (1) ou un int (en fonction du nombre d'options) et affecter les valeurs à chaînes constantes, de cette façon vous économiser de l'espace et les chaînes seront facilement configurable à l'avenir :)

+0

J'utiliserais toujours un int pour n'importe quel identifiant, y compris ceux de simples tables de recherche avec seulement quelques enregistrements. C'est plus cohérent et s'il n'y a pas beaucoup d'enregistrements, vous ne perdrez pas beaucoup d'espace non plus. – GolezTrol

0

PostgreSQL et MySQL supportent enumerated types, ce qui correspond à ce que vous recherchez. Le seul problème avec les types énumérés est la portabilité de la base de données. Oracle, par exemple, n'a pas de types énumérés, donc vous devez utiliser CHAR à la place. Ainsi, si vous utilisez PostgreSQL par exemple, il n'y a aucune raison de ne pas utiliser ses fonctionnalités. Si vous avez besoin de la portabilité d'une base de données, utiliser CHAR (1) ou NUMBER (1) est le plus efficace. Mise à jour: Vous pouvez utiliser une table de recherche avec une clé étrangère comme d'autres réponses l'ont mentionné mais avec des valeurs booléennes qui ne changeront pas, cela introduirait une complexité inutile. Surtout quand vous considérez avoir à créer des classes supplémentaires pour eux dans votre ORM. Cependant, si vous prévoyez une plage de valeurs à modifier pour cette colonne/variable, l'utilisation de la table de conversion est la meilleure solution.

2

Je stocker l'attribut dans la liste sous la forme d'un int et en faire une clé étrangère à une table de recherche où vous pouvez ajouter vos descriptions.

alt text

+0

L'avantage de les avoir dans une table de recherche séparée par rapport aux énumérations, est que vous pouvez utiliser la valeur de recherche plus facilement dans les requêtes de vos programmes. – GolezTrol

0

Je voudrais juste utiliser un char(1) pour une chose si simple; J'appliquerais aussi une contrainte CHECK dessus (si disponible) pour donner une certaine mesure de contrôle de santé mentale. L'ajout d'une table supplémentaire pour quelque chose avec seulement deux valeurs est un peu inutile, même si elle est pendentif correcte. En outre, un S ou R dans la colonne vous aidera lorsque vous déboguez ou déblayez dans la base de données à la main, un 1 ou 6 sera à peu près vide de sens. Bien sûr, si vous avez des valeurs et que vous ne pouvez pas trouver de caractères mnémotechniques sensés pour les représenter, alors l'approche "int et FK" a plus de sens.

Vous pouvez passer de char(1) à "int et un FK" assez facilement si cela devient nécessaire.

Questions connexes