¿Cuál es la mejor manera de almacenar secuencias biológicas UniProt en PostreSQL?
Detalles de datos
- Extraemos 12 millones de secuencias de UniProt ; es probable que este número se duplique cada 3-10 meses.
- La longitud de una secuencia puede variar de 10 a 50 mil millones de caracteres.
- Menos del 1% de las secuencias tienen más de 10 mil caracteres.
- ¿Mejoraría el rendimiento para almacenar las secuencias más largas por separado?
- Una secuencia puede ser de proteína o de alfabeto de ADN
- El alfabeto de ADN tiene 5 caracteres (A, T, C, G o -).
- El alfabeto de proteínas tendrá alrededor de 30 caracteres.
- No nos importa almacenar las secuencias de los dos alfabetos diferentes en columnas diferentes o incluso en tablas diferentes. ¿Eso ayudaría?
Detalles de acceso a datos
Para responder al comentario de Jeremiah Peschka:
- Se accedería a las secuencias de proteínas y ADN en diferentes momentos
- No necesitaría buscar dentro de la secuencia (eso se hace fuera de db)
- ¿Podía acceder Ether a filas individuales a la vez o extraer conjuntos de filas por ID? No necesitaríamos escanear filas. Todas las secuencias están referenciadas por otras tablas: existen varias jerarquías biológicamente y cronológicamente significativas en la base de datos.
Compatibilidad al revés
Sería bueno poder continuar aplicando la siguiente función de hash (SEGUID - IDENTIFICADOR DE SECUENCIA Globalmente Única) a las secuencias.
CREATE OR REPLACE FUNCTION gfam.get_seguid(p_sequence character varying)
RETURNS character varying AS
$BODY$
declare
result varchar := null;
x integer;
begin
select encode(gfam.digest(p_sequence, 'sha1'), 'base64')
into result;
x := length(result);
if substring(result from x for 1) = '=' then
result := substring( result from 1 for x-1 );
end if;
return result;
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;