2012-02-15 11 views
18

Parte de mi aplicación incluye automatización de volumen para canciones.¿La mejor manera de almacenar una matriz en la base de datos MySQL?

La automatización de volumen se describe en el siguiente formato:

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

considero cada elemento de esta matriz de un 'punto de datos' con el primer valor que contiene la posición en la canción y el segundo valor que contiene el volumen en una escala de 0-100.

Luego tomo estos valores y realizo una función del lado del cliente para interpolar estos datos con puntos de datos 'virtuales' para crear una curva de bezier que permite una suave transición de volumen mientras se reproduce un archivo de audio.

Sin embargo, ha surgido la necesidad de permitir que un usuario guarde esta automatización en la base de datos para recuperarla en una fecha posterior.

Los puntos de datos pueden ser ilimitado (aunque en realidad nunca debe exceder realmente alrededor de 40-50 siendo la mayoría de menos de 10)

También cómo debo manejar los datos? ¿Debería almacenarse como está, en un campo de texto? ¿O debería procesarlo de alguna manera de antemano para obtener resultados óptimos?

¿Qué tipo de datos sería mejor utilizar en MySQL para almacenar una matriz?

+0

¿Cuál es el tipo de datos que se trabaja con dentro de su aplicación? ¿Es una cadena, una matriz, un objeto? Recopilo de "tal como está, en un campo de texto" para indicar que estás representando los puntos como una cadena internamente, pero podría estar leyendo eso mal. –

+0

¿Por qué no simplemente crear múltiples campos con el tipo de INT?Por ejemplo volume_min, volume_max, song_position –

+1

Si no es necesario perfeorm consultas de búsqueda de los valores en esa matriz, sólo tiene que utilizar un 'Text' campo y almacenar una versión serializada de la matriz (la forma en que envió aquí está bien, '[[0,50], [20,62], [48,92]]'). –

Respuesta

32

Definitivamente no es un campo text, pero un varchar - quizás. No recomendaría analizar los resultados y almacenarlos en columnas individuales a menos que desee aprovechar esos datos en el sentido de la base de datos: estadísticas, etc.

Si nunca se ve a sí mismo preguntando "¿Cuál es el volumen promedio que usan los usuarios? ? " entonces no te molestes en analizarlo.

Para averiguar cómo almacenar esta información pregúntese "¿Cómo la usaré más adelante?" Si obtendrá la matriz y necesita utilizarla con PHP, puede usar la función serialize. Si va a usar los valores en JavaScript, entonces la codificación JSON probablemente sea la mejor para usted (además de que muchos idiomas saben cómo decodificarla)

¡Buena suerte!

+1

Respuesta perfecta Gracias Mikhail. Cubre todos los puntos que estaban en cuestión. – gordyr

+1

@Mikhail +1 bien, pero ¿por qué _Definitivamente no es un campo 'text'? –

+1

'text' está diseñado para almacenar un texto real, como una historia o un poema. No está diseñado para almacenar una cadena. En el texto MySQL almacena en un archivo en lugar de una "hoja de un árbol". todo es más lento, búsqueda, indexación, almacenamiento en caché. – Mikhail

2

Si la velocidad es la más importante al recuperar las filas, cree una nueva tabla y hágalo dedicado a mantener los índices de su matriz. Utilice el tipo de datos de entero y haga que cada fila represente un índice de la matriz. Tendrá que crear otra columna numérica que los vincule para que pueda volver a ensamblar la matriz con una consulta SQL.

De esta manera ayuda a MySQL a acelerar el acceso. Si solo quiere ciertas partes de la matriz, simplemente cambie el rango en la consulta SQL y puede volver a armar la matriz como lo desee.

2

Le sugiero que eche un vistazo al tipo de datos JSON. De esta manera puede almacenar su matriz de una manera más eficiente que text o varchar, y puede acceder a sus datos directamente desde MySQL sin tener que analizar todo el conjunto.

Tome un vistazo a este enlace: https://dev.mysql.com/doc/refman/5.7/en/json.html

Cuestiones relacionadas