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

Come memorizzare più valori in una singola colonna in cui utilizzare meno memoria?

Se un utente può avere più ruoli, probabilmente è meglio avere un user_role tabella che memorizza queste informazioni. È normalizzato e sarà molto più facile interrogarlo.

Una tabella come:

user_id | role
--------+-----------------
      1 | Admin
      2 | User
      2 | Admin
      3 | User
      3 | Author

Ti consentirà di eseguire query per tutti gli utenti con un ruolo particolare, come SELECT user_id, user.name FROM user_role JOIN user WHERE role='Admin' piuttosto che dover utilizzare l'analisi delle stringhe per ottenere i dettagli da una colonna.

Tra le altre cose, questo sarà più veloce, poiché potrai indicizzare le colonne correttamente e occuperà leggermente più spazio di qualsiasi soluzione che metta più valori in una singola colonna, il che è antitetico a ciò per cui sono progettati i database relazionali.

Il motivo per cui non dovrebbe essere archiviato è che è inefficiente, per il motivo per cui DCoder afferma nel commenta a questa risposta . Per verificare se un utente ha un ruolo, sarà necessario scansionare ogni riga della tabella utente, quindi la colonna "ruoli" dovrà essere scansionata utilizzando la corrispondenza delle stringhe - indipendentemente da come questa azione è esposta, l'RMDBS dovrà eseguire operazioni sulle stringhe per analizzare il contenuto. Si tratta di operazioni molto costose e per nulla di buona progettazione del database.

Se hai necessità per avere un'unica colonna, suggerirei caldamente che non hai più un problema tecnico, ma di gestione del personale . L'aggiunta di tabelle aggiuntive a un database esistente in fase di sviluppo non dovrebbe essere difficile. Se questo non è qualcosa che sei autorizzato a fare, spiega perché la tabella extra è necessaria alla persona giusta, perché mangiando più valori in una singola colonna è un cattivo, cattivo idea .