Il miglior approccio per la memorizzazione di enormi dati

2

Gestirò più di 300.000 utenti. Ogni utente (dopo aver effettuato l'accesso) sarà in grado di creare diciamo "cartelle", in ogni cartella, gli utenti creeranno "nome = valore, nome2 = valore2, nome3 = valore3" coppie di voci. Ogni nome non sarà più di 260 caratteri e ogni valore non sarà più di 1024 byte. Tutti i caratteri leggibili.

Le mie idee per possibili approcci:

  1. Crea tabelle chiamate userentries_ [prima lettera del nome utente] in modo che ci siano 26 tabelle, ogni tabella avrà le voci e l'ID utente. Quindi quando voglio recuperare i dati dell'utente, lo farò

    select * from userentries_[firstletter] where userid= $UID"
    
  2. Crea una singola tabella per contenere tutte le informazioni.

  3. Crea una tabella chiamata userdata, qui avrò UID e FileName. Quindi, quando l'utente vuole recuperare i dati, leggerò il database per trovare il nome del file, quindi aprirò FileName in PHP, creerò una risposta XML / JSON e il client (che sarà app android / ios / desktop) lo elaborerà.

Qual è la migliore e più ottimizzata (speed / performance vise)?

P.S. le coppie nome = valore, ecc. non saranno ricercabili, anche se l'utente dovrebbe cercare attraverso di esse, sarà sul lato client, sicuramente non sul DB

    
posta JustACPPFan 11.12.2014 - 01:59
fonte

3 risposte

2

Potresti utilizzare tre tabelle totali (regola i nomi di tabella / colonna e dialetto SQL da gustare).

Il primo è la tabella utente, che contiene l'elenco principale di user_id.

Il secondo è la tabella delle cartelle, che conterrà un elenco di cartelle per gli utenti.

|  folders         |
|------------------|
| id (int)         |
| user_id (int)    |
| name (varchar)   |

E un terzo per le coppie nome / valore

|  user_data       |
|------------------|
| id (int)         |
| folder_id (int)  |
| name (varchar)   |
| value (varchar)  |

Per richiedere il nome / i valori in una cartella specifica, farebbe qualcosa del tipo:

select name, value from user_data where folder_id = ?

Per interrogare tutti i dati per un utente può essere qualcosa di simile:

select user_data.name, user_data.value 
  from folders
  join user_data on (user_data.folder_id = folders.id) 
  where folders.user_id = ?

In alternativa, denormalizza leggermente la tabella user_data e aggiungi anche user_id. Ciò semplificherà le query per tutti i dati dell'utente, ma dovrai mantenere manualmente le chiavi sincronizzate.

Indicato correttamente, funzionerà correttamente per i set di dati di grandi dimensioni.

    
risposta data 11.12.2014 - 05:38
fonte
1

La domanda può essere riformulata come "Ho l'applicazione canonica perfetta per un archivio di valori-chiave nosql, cosa dovrei fare?". Sì, questo può essere fatto con sql, ma è probabile che un'implementazione nosql sia più efficiente.

Guarda i sistemi come riak, apache cassandra, berkeley db o memcachedb, o se stai pianificando di distribuire dinamodb su Amazon Web Services. Oppure considera un database più tradizionale con memcache o redis come livello di cache.

    
risposta data 11.12.2014 - 09:28
fonte
0

Potresti considerare di non utilizzare affatto SQL, ma di utilizzare qualcosa come la memoria della tabella di Azure.

Troy Hunt ha un interessante articolo sulle sue prestazioni su enormi set di dati: link

    
risposta data 11.12.2014 - 08:29
fonte

Leggi altre domande sui tag