Quelle est la meilleure façon de stocker des séquences biologiques UniProt dans PostreSQL?
Détails des données
- Nous retirons 12 millions de séquences d' UniProt - ce nombre est susceptible de doubler tous les 3 à 10 mois.
- La longueur d'une séquence peut varier de 10 à 50 milliards de caractères
- Moins de 1% des séquences dépassent 10 000 caractères
- Cela améliorerait-il les performances de stocker séparément les séquences plus longues?
- Une séquence peut être de l'alphabet protéine ou ADN
- L'alphabet ADN comporte 5 caractères (A, T, C, G ou -).
- L'alphabet des protéines aura environ 30 caractères.
- Cela ne nous dérange pas de stocker les séquences des deux alphabets différents dans des colonnes différentes ou même des tableaux différents. Est-ce que cela aiderait?
Détails d'accès aux données
Pour répondre au commentaire de Jeremiah Peschka:
- Les séquences de protéines et d'ADN seraient accessibles à différents moments
- N'aurait pas besoin de rechercher dans la séquence (cela se fait en dehors de db)
- L'éther accèderait-il à des lignes uniques à la fois ou retirerait des ensembles de lignes par ID. Nous n'aurions pas besoin de scanner les lignes. Toutes les séquences sont référencées par d'autres tables - plusieurs hiérarchies biologiquement et chronologiquement significatives existent dans la base de données.
Rétrocompatibilité
Il serait intéressant de pouvoir continuer à appliquer la fonction de hachage suivante (SEGUID - SEquence Globally Unique IDentifier) aux séquences.
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;