145 votes

Champ booléen dans Oracle

Hier, j'ai voulu ajouter un champ booléen à une table Oracle. Cependant, il n'existe pas vraiment de type de données booléen dans Oracle. Quelqu'un ici connaît-il la meilleure façon de simuler un booléen ? En cherchant sur Google, j'ai découvert plusieurs approches

  1. Utilisez un nombre entier et ne prenez pas la peine de lui attribuer autre chose que 0 ou 1.

  2. Utilisez un champ de caractères dont les deux seules valeurs sont 'Y' ou 'N'.

  3. Utilisez un enum avec la contrainte CHECK.

Les développeurs Oracle expérimentés savent-ils quelle approche est préférée/canonique ?

82voto

ColinYounger Points 2941

J'ai trouvé este lien utile.

En fait, ils préconisent la méthode numéro 2, pour des raisons d'efficacité, à savoir

create table tbool (bool char check (bool in ('N','Y'));


Version d'archive web : http://web.archive.org/web/20100529164819/http://articles.techrepublic.com.com/5100-10878_11-5229553.html

28voto

Leigh Riffel Points 2550

Oracle lui-même utilise Y/N pour les valeurs booléennes. Pour être complet, il faut noter que pl/sql a un type booléen, ce sont seulement les tables qui n'en ont pas.

Si vous utilisez le champ pour indiquer si l'enregistrement doit être traité ou non, vous pouvez envisager d'utiliser Y et NULL comme valeurs. Cela permet d'obtenir un très petit index (rapide) qui prend très peu de place.

26voto

Bill the Lizard Points 147311

Pour utiliser le moins d'espace possible, vous devez utiliser un champ CHAR limité à 'Y' ou 'N'. Oracle ne prend pas en charge les types de données BOOLEAN, BIT ou TINYINT, de sorte qu'un octet de CHAR est aussi petit que possible.

19voto

Andrew Spencer Points 1870

La meilleure option est 0 et 1 (en tant que chiffres), en utilisant NOT NULL et une contrainte de contrôle pour limiter le contenu à ces valeurs. (Si vous avez besoin que la colonne soit nullable, alors ce n'est pas à un booléen que vous avez affaire mais à une énumération à trois valeurs...)

Avantages de 0/1 :

  • Indépendant de la langue. "Y" et "N" seraient parfaits si tout le monde les utilisait. Mais ce n'est pas le cas. En France, ils utilisent "O" et "N" (je l'ai vu de mes propres yeux). Je suppose que les Finlandais ne sont pas assez stupides pour utiliser le " E " et le " K ", mais je ne m'y fierais pas trop.
  • Congruence avec la pratique de langages de programmation largement utilisés (C, C++, Perl, Javascript).
  • Joue mieux avec la couche applicative, par exemple Hibernate.
  • conduit à un SQL plus succinct, par exemple, pour savoir combien de bananes sont prêtes à être consommées. select sum(is_ripe) from bananas au lieu de select count(*) from bananas where is_ripe = 'Y' ou même (yuk) select sum(case is_ripe when 'Y' then 1 else 0) from bananas

Avantages de 'Y'/'N' :

  • Occupe moins d'espace que 0/1
  • C'est ce qu'Oracle suggère, et c'est peut-être ce à quoi certaines personnes sont plus habituées.

Une autre affiche a suggéré 'Y'/null pour des gains de performance. Si vous avez prouvé que vous avez besoin des performances, alors c'est normal, mais sinon évitez-la car elle rend les requêtes moins naturelles ( some_column is null au lieu de some_column = 0 ) et dans une jointure gauche vous allez confondre la fausseté avec des enregistrements inexistants.

5voto

Matthew Watson Points 7762

Soit 1/0, soit O/N avec une contrainte de contrôle. L'une ou l'autre méthode convient. Personnellement, je préfère 1/0 car je travaille beaucoup en perl, et cela rend très facile les opérations booléennes en perl sur les champs de la base de données.

Si vous souhaitez une discussion approfondie sur cette question avec l'un des responsables d'Oracles, lisez ce que Tom Kyte a à dire à ce sujet. Ici

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