Domanda

Nella mia domanda, mi piacerebbe all'utente di selezionare i suoi giorni lavorativi. poi memorizzarli nel database. Naturalmente la mia applicazione elaborerà i dati degli utenti come:. E 'oggi una giornata di lavoro per un utente specifico, chi sono gli utenti che dovrebbero funzionare oggi, ... etc

La mia domanda è, qual è la migliore pratica per fare questo? uso dovrebbe I:

  1. campo Bitmasking nella tabella utenti
  2. molti a molti tavoli rapporti con la creazione di tavolo per giorni, gli utenti e days_users. Grazie in anticipo.
È stato utile?

Soluzione

Direi che i campi maschera di bit sono un anti-modello relazionale.

Un campo deve avere un unico valore significativo, altrimenti si finisce con l'interrogazione di problemi -. L'analisi del campo ogni volta che avete bisogno di query utilizzando lo

Un tale campo richiede anche documentazione extra, come i valori che i negozi non sono auto che descrive.

Altri suggerimenti

campo Bitmasking è un po 'più criptico in natura ed è necessario creare qualcosa di diverso di interpretare ciò che si memorizza nella maschera di bit.

Il secondo approccio è molto più trasparente e facilmente comprensibile ed è un po 'più flessibile, se è necessario aggiungere più valori. Con la maschera di bit, è ancora una volta necessario ripetere la bitmap decoder ogni volta che si aggiunge un valore che può essere un incubo manutenzione rispetto all'approccio relazionale.

Ho fatto l'errore di andare con l'opzione 1, e data la possibilità di tornare indietro nel tempo vorrei assolutamente fare il contrario.

Il database quasi certamente non utilizzare un indice per fare query bit a bit sulla vostra maschera di bit. Quindi, se si vuole trovare, per esempio, tutti i martedì di lavoro, si sta andando a fare un indice di scansione ogni volta. Come le tabelle diventano grandi, questo può distruggere la vostra performance. Si può cercare di ottimizzare intorno a questo memorizzando una SELECT DISTINCT(bitmaskfield) prima del tempo, facendo la logica maschera di bit nella propria applicazione, e turing in una clausola WHERE bitmaskfield IN (...) appropriato, ma che diventa rapidamente impossibile da mantenere, come è quindi necessario aggiornare il distinto-maschera di bit cache in ogni luogo che si modificano i valori nel database.

Le tabelle extra e si unisce possono sembrare come un dolore, ma la maschera di bit andrà a finire peggio. Fidati di me su questo. Utilizzare il database come un database.

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