2012-02-15 18 views
18

Parte della mia app include l'automazione del volume per le canzoni.Il modo migliore per memorizzare un array nel database MySQL?

L'automazione del volume è descritta nel seguente formato:

[[0,50],[20,62],[48,92]] 

ritengo ogni elemento in questo array un 'punto dati' con il primo valore contenente la posizione nella canzone e il secondo valore contenente il volume su una scala da 0 a 100.

Poi prendo questi valori ed eseguo una funzione lato client per interpolare questi dati con punti dati "virtuali" al fine di creare una curva di bezier che consenta una transizione graduale del volume durante la riproduzione di un file audio.

Tuttavia, è sorta la necessità di consentire a un utente di salvare questa automazione nel database per il richiamo in un secondo momento.

I datapoints possono essere illimitato (anche se in realtà non dovrebbe mai realmente superare i circa 40-50 con la maggior parte di essere inferiore a 10)

Inoltre come devo gestire i dati? Dovrebbe essere memorizzato così com'è, in un campo di testo? O dovrei elaborarlo in qualche modo in anticipo per ottenere risultati ottimali?

Quale tipo di dati sarebbe meglio utilizzare in MySQL per memorizzare un array?

+0

Qual è il tipo di dati che si sta lavorando con all'interno della vostra app? È una stringa, un array, un oggetto? Raccolgo da "come è, in un campo di testo" per indicare che stai rappresentando i punti come una stringa internamente, ma potrei leggere quello sbagliato. –

+0

Perché non creare semplicemente più campi con il tipo di INT?Ad esempio volume_min, volume_max, song_position –

+1

Se non è necessario perfezionare le query alla ricerca di valori in quell'array, è sufficiente utilizzare un campo 'text' e memorizzare una versione serializzata dell'array (il modo in cui l'hai postato qui è ok, '[[0,50], [20,62], [48,92]]'). –

risposta

32

Sicuramente non un campo text, ma un varchar - forse. Non consiglierei di analizzare i risultati e archiviarli in colonne individuali a meno che non vogliate trarre vantaggio da questi dati nel database - statistiche ecc.

Se non vi vedete mai chiedere "Qual è il volume medio che gli utenti usano ?" quindi non preoccuparti di analizzarlo.

Per capire come conservare questi dati, chiedetevi "Come lo userò più tardi?" Se si ottiene la matrice e si ha bisogno di utilizzarla con PHP, è possibile utilizzare la funzione serialize. Se utilizzerai i valori in JavaScript, la codifica JSON sarà probabilmente la migliore per te (più molte lingue sanno come decodificarlo)

Buona fortuna!

+1

Risposta perfetta Mikhail grazie. Copre tutti i punti che erano in questione. – gordyr

+1

@Mikhail +1 tutto bene, ma perché _Finitamente non è un campo 'testo'? –

+1

'text' è progettato per memorizzare un testo reale - come una storia o una poesia. Non è progettato per memorizzare una stringa. In MySQL gli archivi di testo in un file piuttosto che una "foglia di un albero". tutto è più lento, ricerca, indicizzazione, memorizzazione nella cache. – Mikhail

2

Se la velocità è il più importante quando si recuperano le righe, creare una nuova tabella e renderla dedicata a contenere gli indici dell'array. Usa il tipo di dati del numero intero e ogni riga rappresenta un indice dell'array. Dovrai creare un'altra colonna numerica che li unisca insieme in modo da poter riassemblare l'array con una query SQL.

In questo modo si aiuta MySQL ad accelerare l'accesso. Se si desidera solo alcune parti dell'array, basta modificare l'intervallo nella query SQL e si può ricomporre l'array come si desidera.

2

Ti suggerisco di dare un'occhiata al tipo di dati JSON. In questo modo puoi archiviare la tua matrice in un modo più efficiente di testo o varchar, e puoi accedere ai tuoi dati direttamente da MySQL senza dover analizzare il tutto.

Date un'occhiata a questo link: https://dev.mysql.com/doc/refman/5.7/en/json.html

Problemi correlati