Domanda Campo booleano in Oracle


Ieri ho voluto aggiungere un campo booleano a un tavolo Oracle. Tuttavia, in realtà non esiste un tipo di dati booleani in Oracle. Qualcuno qui conosce il modo migliore per simulare un booleano? Googling l'argomento ha scoperto diversi approcci

  1. Usa un numero intero e non preoccuparti di assegnare niente di diverso da 0 o 1 ad esso.

  2. Usa un campo char con 'Y' o 'N' come gli unici due valori.

  3. Usa un enum con il vincolo CHECK.

Gli sviluppatori Oracle esperti sanno quale approccio è preferito / canonico?


139
2017-08-27 13:16


origine


risposte:


ho trovato Questo collegamento utile.

Ecco il paragrafo che evidenzia alcuni dei pro / contro di ciascun approccio.

Il design più comunemente visto è quello di imitare i molti simil-booleani   segnala le visualizzazioni del dizionario dei dati di Oracle, selezionando 'Y' per vero   e 'N' per falso. Tuttavia, per interagire correttamente con l'host   ambienti, come JDBC, OCCI e altri ambienti di programmazione,   è meglio selezionare 0 per false e 1 per true in modo che funzioni   correttamente con le funzioni getBoolean e setBoolean.

Sostanzialmente sostengono il metodo numero 2, per ragioni di efficienza, usando

  • valori di 0/1 (a causa dell'interoperabilità con JDBC getBoolean() ecc.) con un vincolo di controllo
  • un genere di CHAR (perché usa meno spazio di NUMBER).

Il loro esempio:

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

79
2017-08-27 13:23



Oracle stesso utilizza Y / N per i valori booleani. Per completezza va notato che pl / sql ha un tipo booleano, sono solo le tabelle che non lo fanno.

Se si sta utilizzando il campo per indicare se il record deve essere elaborato o meno, si potrebbe prendere in considerazione l'uso di Y e NULL come valori. Questo rende molto piccolo (leggi veloce) indice che occupa pochissimo spazio.


28
2017-10-21 19:23



Per usare la minima quantità di spazio dovresti usare un campo CHAR vincolato a 'Y' o 'N'. Oracle non supporta i tipi di dati BOOLEAN, BIT o TINYINT, quindi il byte di CHAR è il più piccolo possibile.


26
2017-08-27 13:29



L'opzione migliore è 0 e 1 (come numeri - un'altra risposta suggerisce 0 e 1 come CHAR per l'efficienza nello spazio, ma per me è un po 'troppo tortuoso), usando NOT NULL e un vincolo di controllo per limitare il contenuto a quei valori. (Se hai bisogno che la colonna sia nullable, allora non è un booleano che hai a che fare, ma un'enumerazione con tre valori ...)

Vantaggi di 0/1:

  • Lingua indipendente. 'Y' e 'N' andrebbero bene se tutti lo usassero. Ma loro non lo fanno. In Francia usano "O" e "N" (l'ho visto con i miei occhi). Non ho programmato in Finlandia per vedere se usano "E" e "K" lì - senza dubbio sono più intelligenti di così, ma non si può essere sicuri.
  • Congruente con la pratica in linguaggi di programmazione ampiamente utilizzati (C, C ++, Perl, Javascript)
  • Riproduce meglio con il livello di applicazione, ad es. ibernare
  • Porta a SQL più sintetico, ad esempio, per scoprire quante banane sono pronte da mangiare select sum(is_ripe) from bananas invece di select count(*) from bananas where is_ripe = 'Y' o anche (yuk) select sum(case is_ripe when 'Y' then 1 else 0) from bananas

Vantaggi di 'Y' / 'N':

  • Prende meno spazio di 0/1
  • È ciò che suggerisce Oracle, quindi potrebbe essere quello a cui alcune persone sono più abituate

Un altro poster ha suggerito "Y" / null per i guadagni in termini di prestazioni. Se lo hai comprovata che è necessario il rendimento, quindi abbastanza equo, ma altrimenti evitare poiché rende l'interrogazione meno naturale (some_column is null invece di some_column = 0) e in un join di sinistra si confondono falsità con record inesistenti.


19
2018-05-06 12:25



O 1/0 o Y / N con un vincolo di controllo su di esso. la via dell'etere va bene. Personalmente preferisco 1/0 perché faccio molto lavoro in perl, e rende molto facile fare operazioni booleane perl sui campi del database.

Se vuoi una discussione veramente approfondita su questa domanda con uno dei migliori orchi di Oracles, dai un'occhiata a ciò che Tom Kyte ha da dire su questo Qui


5
2017-08-31 17:11



Il database che ho fatto la maggior parte del mio lavoro sull'uso di 'Y' / 'N' come booleani. Con questa implementazione, puoi trarre alcuni trucchi come:

  1. Contare le righe che sono vere:
    SELECT SUM (CASE WHEN BOOLEAN_FLAG = 'Y' THEN 1 ELSE 0) DA X

  2. Quando raggruppa le righe, applica "Se una riga è vera, quindi tutte sono vere" logica:
    SELEZIONA MAX (BOOLEAN_FLAG) DA Y
    Al contrario, usa MIN per forzare il raggruppamento falso se una riga è falsa.


4
2017-08-27 13:36



Un esempio funzionante per implementare la risposta accettata aggiungendo una colonna "booleana" a una tabella esistente in un database Oracle (utilizzando number genere):

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))
);

Questo crea una nuova colonna in my_table_name chiamato my_new_boolean_column con valori predefiniti pari a 0. La colonna non accetterà NULL valori e limita i valori accettati a entrambi 0 o 1.


2
2017-10-03 21:57



Nei nostri database utilizziamo un enum che garantisce il superamento di VERO o FALSO. Se lo fai uno dei primi due modi è troppo facile o iniziare ad aggiungere un nuovo significato all'intero senza passare attraverso una progettazione adeguata, o finire con quel campo char avendo Y, y, N, n, T, t, F, valori f e dover ricordare quale sezione di codice utilizza quale tabella e quale versione di true sta usando.


1
2017-08-27 13:22