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

MySQL:più tavoli o un grande tavolo?

Se aderisci a Zero, One or Many principio, per cui o non esiste una cosa del genere, una di queste, o un numero illimitato, costruiresti sempre tabelle correttamente normalizzate per tenere traccia di cose come questa.

Ad esempio, un possibile schema:

CREATE TABLE user_attributes (
  id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  user_id INT NOT NULL,
  attribute_name VARCHAR(255) NOT NULL,
  attribute_value VARCHAR(255),
  UNIQUE INDEX index_user_attributes_name(user_id, attribute_name)
);

Questo è il modello di base del negozio valore-chiave in cui puoi averne molti attributi per utente.

Sebbene i requisiti di archiviazione per questo siano superiori a un accordo a colonne fisse con nomi perennemente frustranti come attribute1 , il costo è abbastanza basso nell'era dei dischi rigidi da terabyte che raramente è un problema.

In genere creeresti una singola tabella per questi dati fino a quando il tempo di inserimento non diventa un problema. Finché i tuoi inserti sono veloci, non me ne preoccuperei. A quel punto dovresti prendere in considerazione un sharding strategia per dividere questi dati in più tabelle con uno schema identico, ma solo se necessario.

Immagino che sarebbe nella fase di ~ 10-50 milioni di righe, ma potrebbe essere maggiore se la quantità di attività di inserimento in questa tabella è relativamente bassa.

Non dimenticare che il modo migliore per ottimizzare l'attività di lettura è utilizzare una cache:la query del database più veloce è quella che non esegui. Per questo genere di cose di solito usi qualcosa come memcached per memorizzare i risultati dei recuperi precedenti e lo invalideresti in una scrittura.

Come sempre, confronta qualsiasi schema proposto in produzione scala.