Jaki jest najlepszy sposób przechowywania sekwencji biologicznych UniProt w PostreSQL?
Szczegóły danych
- Pobieramy 12 milionów sekwencji z UniProt - liczba ta może się podwoić co 3-10 miesięcy.
- Długość sekwencji może wynosić od 10 do 50 miliardów znaków
- Mniej niż 1% sekwencji ma więcej niż 10 tysięcy znaków
- Czy poprawiłoby się wydajność oddzielnego przechowywania dłuższych sekwencji?
- Sekwencja może być alfabetem białkowym lub DNA
- Alfabet DNA ma 5 znaków (A, T, C, G lub -).
- Alfabet białkowy będzie miał około 30 znaków.
- Nie mamy nic przeciwko przechowywaniu sekwencji dwóch różnych alfabetów w różnych kolumnach lub nawet w różnych tabelach. Czy to pomogłoby?
Szczegóły dostępu do danych
Aby odpowiedzieć na komentarz Jeremiasza Peschki:
- Sekwencje białek i DNA będą dostępne w różnych momentach
- Nie musiałbym wyszukiwać w sekwencji (odbywa się to poza db)
- Czy eter uzyskiwałby dostęp do pojedynczych wierszy na raz lub wyciągałby zestawy wierszy według identyfikatorów. Nie musielibyśmy skanować wierszy. Wszystkie sekwencje są przywoływane przez inne tabele - w bazie danych istnieje kilka hierarchicznie znaczących biologicznie i chronologicznie hierarchii.
Kompatybilność wsteczna
Byłoby miło móc nadal stosować następującą funkcję haszującą (SEGUID - Sekwencja Globalnie Unikalny Identyfikator) do sekwencji.
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;