Domanda

Ieri volevo aggiungere un campo booleano a una tabella Oracle.Tuttavia, in Oracle non esiste effettivamente un tipo di dati booleano.Qualcuno qui conosce il modo migliore per simulare un valore booleano?Cercando su Google l'argomento sono stati scoperti diversi approcci

  1. Usa un numero intero e non preoccuparti di assegnargli altro che 0 o 1.

  2. Utilizza un campo di caratteri con "Y" o "N" come unici due valori.

  3. Utilizza un'enumerazione con il vincolo CHECK.

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

È stato utile?

Soluzione

ho trovato Questo collegamento utile.

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

Il design più comunemente visto è imitare le molte bandiere simili a booleane che le viste del dizionario dei dati di Oracle usano, selezionando "y" per vero e "n" per false.Tuttavia, per interagire correttamente con gli ambienti host, come JDBC, OCCI e altri ambienti di programmazione, è meglio selezionare 0 per false e 1 per vero in modo che possa funzionare correttamente con le funzioni Getboolean e SetBoolean.

Fondamentalmente sostengono il metodo numero 2, per motivi di efficienza, utilizzando

  • valori di 0/1 (a causa dell'interoperabilità con JDBC getBoolean() ecc.) con un vincolo check
  • UN tipo di CHAR (perché utilizza 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);`

Altri suggerimenti

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 hanno.

Se stai utilizzando il campo per indicare se il record deve essere elaborato o meno, potresti prendere in considerazione l'utilizzo di Y e NULL come valori.Ciò crea un indice molto piccolo (leggi velocemente) che occupa pochissimo spazio.

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

L'opzione migliore è 0 e 1 (come numeri: un'altra risposta suggerisce 0 e 1 come CAR per efficienza di spazio ma è un po' troppo contorto per me), usando NOT NULL e un vincolo check per limitare i contenuti a quei valori.(Se hai bisogno che la colonna sia nullable, allora non hai a che fare con un valore booleano ma con un'enumerazione con tre valori...)

Vantaggi di 0/1:

  • Indipendente dalla lingua.'Y' e 'N' andrebbero bene se tutti lo usassero.Ma non lo fanno.In Francia usano la "O" e la "N" (l'ho visto con i miei occhi).Non ho programmato in Finlandia per vedere se lì usano la "E" e la "K": senza dubbio sono più intelligenti di così, ma non puoi esserne sicuro.
  • Congruente con la pratica nei linguaggi di programmazione ampiamente utilizzati (C, C++, Perl, Javascript)
  • Funziona meglio con il livello dell'applicazione, ad es.Ibernazione
  • Porta a un SQL più conciso, 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 'S'/'N':

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

Un altro utente ha suggerito "Y"/null per miglioramenti delle prestazioni.Se hai provato che hai bisogno delle prestazioni, quindi abbastanza giusto, ma altrimenti evitalo poiché rende le query meno naturali (some_column is null invece di some_column = 0) e in un join a sinistra confonderai la falsità con record inesistenti.

O 1/0 o Y/N con un vincolo di controllo su di esso.l'altro modo va bene.Personalmente preferisco 1/0 poiché lavoro molto in Perl e rende davvero semplice eseguire operazioni booleane Perl sui campi del database.

Se vuoi una discussione davvero approfondita su questa domanda con uno dei capi di Oracle, controlla cosa ha da dire Tom Kyte al riguardo Qui

Il database su cui ho svolto la maggior parte del mio lavoro utilizzava "Y" / "N" come booleani.Con questa implementazione, puoi realizzare alcuni trucchi come:

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

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

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

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.

Nei nostri database utilizziamo un'enumerazione che garantisce di trasmetterla TRUE o FALSE.Se lo fai in uno dei primi due modi, è troppo facile iniziare ad aggiungere un nuovo significato all'intero senza passare attraverso una progettazione adeguata, o finire con quel campo di caratteri che ha Y, y, N, n, T, t, Valori F, f e dover ricordare quale sezione di codice utilizza quale tabella e quale versione di true sta utilizzando.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top