Qual é a melhor maneira de armazenar sequências biológicas UniProt no PostreSQL?
Detalhes dos dados
- Obtemos 12 milhões de sequências do UniProt - esse número provavelmente dobrará a cada 3-10 meses.
- O comprimento de uma sequência pode variar de 10 a 50 bilhões de caracteres
- Menos de 1% das sequências têm mais de 10 mil caracteres
- Melhoraria o desempenho para armazenar seqüências mais longas separadamente?
- Uma sequência pode ser do alfabeto Protein ou DNA
- O alfabeto de DNA possui 5 caracteres (A, T, C, G ou -).
- O alfabeto de proteínas terá cerca de 30 caracteres.
- Não nos importamos de armazenar as seqüências dos dois alfabetos diferentes em colunas diferentes ou mesmo em tabelas diferentes. Isso ajudaria?
Detalhes de acesso a dados
Para responder ao comentário de Jeremiah Peschka:
- As seqüências de proteínas e DNA seriam acessadas em diferentes momentos
- Não precisaria procurar na sequência (isso é feito fora do banco de dados)
- O éter acessaria linhas únicas por vez ou retiraria conjuntos de linhas por IDs. Não precisaríamos varrer linhas. Todas as seqüências são referenciadas por outras tabelas - existem várias hierarquias com significado biológico e cronológico no banco de dados.
Compatibilidade com versões anteriores
Seria bom poder continuar aplicando a seguinte função de hash (SEGUID - ID global identificador exclusivo global da sequência) às seqüências.
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;