Asumo que está pensando en matrices dispersas de contexto matemático: técnicas http://en.wikipedia.org/wiki/Sparse_matrix (el almacenamiento describió existen para el almacenamiento de memoria (operación rápida aritmética), no en el almacenamiento persistente (bajo uso de disco).)
Dado que uno normalmente opera en estas matrices en el lado del cliente en lugar de en el lado del servidor, ¡SQL-ARRAY [] es la mejor opción!
La pregunta es ¿cómo aprovechar la dispersión de la matriz? Aquí los resultados de algunas investigaciones.
Configuración:
- Postgres 8.4
- Matrices w/400 * 400 elementos de doble precisión (8 bytes) -> 1.28MiB tamaño en bruto por matriz
elementos
- 33% no cero - -> 427kiB tamaño efectivo por matriz
- promedió usando ~ 1000 diferentes matrices pobladas aleatorios
métodos compiten:
- confiar en el lado del servidor automáticacompresión de columnas con el conjunto de almacenamiento principal o extendida.
- Solo almacene los elementos distintos de cero más un mapa de bits (
bit varying(xx)
) describiendo dónde ubicar los elementos distintos de cero en la matriz. (Una precisión doble es 64 veces mayor que un bit. En teoría (ignorando los gastos generales) este método debería ser una mejora si < = 98% no son cero ;-)). La compresión del lado del servidor está activada.
- Reemplazar los ceros en la matriz con NULL. (Los RDBMS son muy efectivos para almacenar valores NULL). La compresión del lado del servidor está activada.
(indexación de elementos distintos de cero utilizando un segundo índice de ARRAY [] no es muy prometedor y por lo tanto no evaluados.)
Resultados:
- compresión automática
- sin esfuerzos de implementación adicionales
- sin tráfico de red reducido
- mínima compresión overhead
- almacenamiento persistente = 39% del tamaño prima
- Bitmap
- esfuerzo de implementación aceptable
- tráfico de red disminuyó ligeramente; depende de escasez
- almacenamiento persistente = 33,9% del tamaño prima
- Sustituir ceros con nulos
- un poco de esfuerzo de aplicación (API necesita saber dónde y cómo establecer los valores NULL en el ARRAY [] al construir la consulta INSERT)
- sin cambios en el tráfico de la red
- persistent storage = 35% of th e tamaño prima
Conclusión: Comience con el parámetro de ampliación de almacenamiento/MAIN. Si tiene algo de tiempo libre, investigue sus datos y use la configuración de prueba con su nivel de dispersión. Pero el efecto puede ser menor de lo esperado.
Sugiero siempre usar la serialización de matrices (por ejemplo, orden de Fila mayor) más dos columnas enteras para las dimensiones de matriz NxM. Como la mayoría de las API usan SQL textual, está guardando mucho tráfico de red y memoria de cliente para "ARRAY [ARRAY [..], ARRAY [..], ARRAY [..], ARRAY [..], ..] anidados". !!!
Tebas
CREATE TABLE _testschema.matrix_dense
(
matdata double precision[]
);
ALTER TABLE _testschema.matrix_dense ALTER COLUMN matdata SET STORAGE EXTERN;
CREATE TABLE _testschema.matrix_sparse_autocompressed
(
matdata double precision[]
);
CREATE TABLE _testschema.matrix_sparse_bitmap
(
matdata double precision[]
bitmap bit varying(8000000)
);
Insertar las mismas matrices en todas las mesas. Los datos concretos dependen de la tabla determinada. No cambie los datos en el lado del servidor debido a las páginas asignadas pero no utilizadas. O haz un VACÍO.
SELECT
pg_total_relation_size('_testschema.matrix_dense') AS dense,
pg_total_relation_size('_testschema.matrix_sparse_autocompressed') AS autocompressed,
pg_total_relation_size('_testschema.matrix_sparse_bitmap') AS bitmap;
También podría crear una 'característica' TYPE COMO featurename VARCHAR, featurevalue VARCHAR (o el valor que necesite) y agregue un campo FEATURES de tipo feature [] a su tabla principal. – MkV
¿Por qué llama a EAV un "antipatrón"? Googling muestra que esta es una descripción común de EAV (generalmente utilizada de manera despectiva), pero nadie parece explicar por qué. Parece haber muchos casos válidos en los que las bases de datos necesitan almacenar datos dispersos, como el campo médico, lo que hace que EAV sea un "patrón" adecuado. – Cerin
Descarta todas las ventajas de la base de datos, las restricciones de nivel de fila y la integridad referencial y hace que sea difícil devolver una sola fila para una sola entidad. – MkV