È possibile archiviare e interrogare combinazioni di informazioni di tipo booleano in un numero intero?

0

Con un booleano, è semplicemente 0 e 1 , ed è semplice da interrogare.

Con due booleani, diventa necessario specificare cosa significa ogni numero, es:

  • 0 F-F
  • 1 F-T
  • 2 T-F
  • 3 T-T

Qui è facile eseguire una query per tutte le voci in cui il primo valore booleano è T di foo > 1 . Ma cosa succede se vuole tutte le righe in cui il secondo booleano è T (mentre sta ancora usando l'indice del database in modo efficiente e senza usare OR)?

Che cosa succede se ci sono sei booleani e vuole interrogare tutte le voci in cui il primo e il terzo booleano sono T, e il sesto booleano è F? Esiste un modello di progettazione per memorizzare i booleani in un numero intero e consentire questo tipo di query?

    
posta dtgq 03.08.2017 - 03:52
fonte

1 risposta

3

Puoi richiedere una array di bit usando operatori bit a bit , ed è possibile memorizzare array di bit in un tipo intero. Gli operatori bit a bit non sono una funzionalità ANSI SQL specificata, ma la maggior parte degli RDBMS li ha implementati. Alcuni RDBMS hanno un supporto speciale per i bit array.

Interrogazione

Puoi cercare la verità inserendo il bit in bit per bit con quel bit attivato.

Ad esempio:

WHERE col & 2 = 2

Troverebbe tutte le righe in cui il secondo booleano nell'array di bit è vero. Ecco un'illustrazione di ciò che sta facendo:

  01010010  bit array
& 00000010  2
= 00000010  2 -- true

  01011100  bit array
& 00000010  2
= 00000000  0 -- false

Aggiornamento

Per impostare un determinato bit, usa l'operazione bitmap or

Ad esempio:

SET col = col | 2

Aggiorna col per impostare il secondo bit su true.

Si noti che potrebbe non essere una buona decisione a lungo termine conservare un array di bit nel database. Probabilmente ti servirà meglio memorizzando diverse colonne booleane perché potresti avere un migliore controllo sull'indicizzazione e sarà più facile per gli altri capire che cosa stai interrogando. Consulta i consigli in questa risposta .

Modifica: Poiché stai utilizzando Postgres, puoi dare un'occhiata al loro tipo bit-string . Puoi utilizzare gli stessi operatori bit a bit, ma è un po 'più facile da leggere ed esprimere utilizzando la sintassi della stringa di bit .

    
risposta data 03.08.2017 - 03:58
fonte

Leggi altre domande sui tag