Mysql
 sql >> Database >  >> RDS >> Mysql

Come memorizzare 60 booleani in un database MySQL?

Una colonna separata per valore è più flessibile quando si tratta di cercare.

Una tabella chiave/valore separata è più flessibile se righe diverse hanno raccolte diverse di valori booleani.

E, se

  1. il tuo elenco di valori booleani è più o meno statico
  2. tutte le tue righe hanno tutti quei valori booleani
  3. la tua ricerca critica per le prestazioni consiste nel trovare le righe in cui uno qualsiasi dei valori è falso

quindi utilizzare stringhe di testo come "1001010010" ecc. È un buon modo per archiviarle. Puoi cercare in questo modo

 WHERE flags <> '11111111'

per trovare le righe che ti servono.

Potresti usare una colonna BINARY con un bit per flag. Ma la tua tabella sarà più facile da usare per le query casuali e l'ispezione del bulbo oculare se usi il testo. Il risparmio di spazio derivante dall'utilizzo di BINARY invece di CHAR non sarà significativo finché non inizierai a memorizzare molti milioni di righe.

modifica Va detto:ogni volta che ho costruito qualcosa del genere con matrici di attributi booleani, in seguito sono rimasto deluso da quanto si sia rivelato inflessibile. Ad esempio, supponiamo che fosse un catalogo di lampadine. All'inizio del millennio, le bandiere booleane avrebbero potuto essere roba del genere

screw base
halogen
mercury vapor
low voltage

Poi, le cose cambiano e mi ritrovo ad aver bisogno di più flag booleani, come,

LED
CFL 
dimmable
Energy Star

ecc. All'improvviso i miei tipi di dati non sono abbastanza grandi da contenere ciò di cui ho bisogno che contengano. Quando ho scritto "il tuo elenco di valori booleani è più o meno statico" intendevo dire che non ti aspetti ragionevolmente che qualcosa come le caratteristiche della lampadina cambi durante il ciclo di vita della tua applicazione.

Quindi, una tabella separata di attributi potrebbe essere una soluzione migliore. Avrebbe queste colonne:

   item_id           fk to item table         -- pk
   attribute_id      attribute identifier     -- pk
   attribute_value   

Questo è in definitiva flessibile. Puoi semplicemente aggiungere nuovi flag. Puoi aggiungerli agli elementi esistenti o ai nuovi elementi in qualsiasi momento durante il ciclo di vita dell'applicazione. E ogni articolo non ha bisogno della stessa collezione di bandiere. Puoi scrivere "quali elementi hanno attributi falsi?" query in questo modo:

 SELECT DISTINCT item_id FROM attribute_table WHERE attribute_value = 0

Ma devi stare attento perché la query "quali elementi hanno attributi mancanti" è molto più difficile da scrivere.