Question

Hier, je voulais ajouter un champ booléen à une table Oracle.Cependant, il n’existe pas réellement de type de données booléen dans Oracle.Est-ce que quelqu'un ici connaît la meilleure façon de simuler un booléen ?La recherche sur Google sur le sujet a découvert plusieurs approches

  1. Utilisez un entier et ne vous embêtez pas à lui attribuer autre chose que 0 ou 1.

  2. Utilisez un champ char avec « Y » ou « N » comme deux seules valeurs.

  3. Utilisez une énumération avec la contrainte CHECK.

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

Était-ce utile?

La solution

j'ai trouvé ce lien utile.

Voici le paragraphe mettant en évidence certains des avantages/inconvénients de chaque approche.

La conception la plus couramment vue est d'imiter les nombreux indicateurs de type booléen que les vues du dictionnaire de données d'Oracle utilisent, sélectionnant «y» pour true et «n» pour false.Cependant, pour interagir correctement avec l’hôte tels que JDBC, OCCI et d’autres environnements de programmation, Il est préférable de sélectionner 0 pour false et 1 pour true afin que cela puisse fonctionner correctement avec les fonctions getBoolean et setBoolean.

En gros, ils préconisent la méthode numéro 2, par souci d'efficacité, en utilisant

  • valeurs de 0/1 (en raison de l'interopérabilité avec JDBC getBoolean() etc.) avec une contrainte de vérification
  • un taper de CHAR (car il utilise moins d’espace que NUMBER).

Leur exemple :

create table tbool (bool char check (bool in (0,1));
insert into tbool values(0);
insert into tbool values(1);`

Autres conseils

Oracle lui-même utilise Y/N pour les valeurs booléennes.Par souci d'exhaustivité, il convient de noter que pl/sql a un type booléen, ce ne sont que 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 donne un index très petit (à lecture rapide) qui prend très peu de place.

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, donc un octet de CHAR est aussi petit que possible.

La meilleure option est 0 et 1 (sous forme de nombres – une autre réponse suggère 0 et 1 comme CARBONISER pour l'efficacité spatiale mais c'est un peu trop tordu pour moi), en utilisant NOT NULL et une contrainte de vérification pour limiter le contenu à ces valeurs.(Si vous avez besoin que la colonne soit nullable, alors vous n'avez pas affaire à un booléen mais à une énumération avec trois valeurs...)

Avantages du 0/1 :

  • Indépendant de la langue.« Y » et « N » conviendraient si tout le monde les utilisait.Mais ce n’est pas le cas.En France, on utilise le « O » et le « N » (je l'ai vu de mes propres yeux).Je n'ai pas programmé en Finlande pour voir s'ils utilisent le « E » et le « K » là-bas – ils sont sans aucun doute plus intelligents que cela, mais vous ne pouvez pas en être sûr.
  • Conforme à la pratique des langages de programmation largement utilisés (C, C++, Perl, Javascript)
  • Joue mieux avec la couche d'application, par ex.Hiberner
  • Mène à un SQL plus succinct, par exemple, pour savoir combien de bananes sont prêtes à manger select sum(is_ripe) from bananas au lieu de select count(*) from bananas where is_ripe = 'Y' ou même (berk) select sum(case is_ripe when 'Y' then 1 else 0) from bananas

Avantages de « Y »/« N » :

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

Une autre affiche suggérait « Y »/null pour des gains de performances.Si vous avez éprouvé que vous avez besoin de performances, alors c'est assez juste, mais sinon évitez car cela rend les requêtes moins naturelles (some_column is null au lieu de some_column = 0) et dans une jointure à gauche, vous confondrez la fausseté avec des enregistrements inexistants.

Soit 1/0, soit Y/N avec une contrainte de vérification.la voie éther est très bien.Personnellement, je préfère 1/0 car je fais beaucoup de travail en Perl, et cela rend très facile les opérations booléennes Perl sur les champs de base de données.

Si vous souhaitez une discussion vraiment approfondie de cette question avec l'un des grands patrons d'Oracle, découvrez ce que Tom Kyte a à dire à ce sujet. Ici

La base de données sur laquelle j'ai effectué la plupart de mon travail utilisait « Y » / « N » comme booléens.Avec cette implémentation, vous pouvez réaliser quelques astuces telles que :

  1. Comptez les lignes vraies :
    SELECT SUM(CASE WHEN BOOLEAN_FLAG = 'Y' THEN 1 ELSE 0) FROM X

  2. Lors du regroupement de lignes, appliquez la logique « Si une ligne est vraie, alors toutes sont vraies » :
    SELECT MAX(BOOLEAN_FLAG) FROM Y
    À l’inverse, utilisez MIN pour forcer le regroupement à faux si une ligne est fausse.

Un exemple fonctionnel pour implémenter la réponse acceptée en ajoutant une colonne « booléenne » à une table existante dans une base de données Oracle (en utilisant number taper):

ALTER TABLE my_table_name ADD (
my_new_boolean_column number(1) DEFAULT 0 NOT NULL
CONSTRAINT my_new_boolean_column CHECK (my_new_boolean_column in (1,0))
);

Cela crée une nouvelle colonne dans my_table_name appelé my_new_boolean_column avec des valeurs par défaut de 0.La colonne n'acceptera pas NULL valeurs et restreint les valeurs acceptées à l'un ou l'autre 0 ou 1.

Dans nos bases de données, nous utilisons une énumération qui garantit que nous la transmettons VRAI ou FAUX.Si vous le faites de l'une des deux premières manières, il est trop facile soit de commencer à ajouter une nouvelle signification à l'entier sans passer par une conception appropriée, soit de finir avec ce champ de caractères ayant Y, y, N, n, T, t, Valeurs F, f et devoir se rappeler quelle section de code utilise quelle table et quelle version de true elle utilise.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top