Каков наилучший способ хранения биологических последовательностей UniProt в PostreSQL?
Детали данных
- Мы получаем 12 миллионов последовательностей из UniProt - это число, вероятно, будет удваиваться каждые 3-10 месяцев.
- Длина последовательности может варьироваться от 10 до 50 миллиардов символов
- Менее 1% последовательностей длиннее 10 тысяч символов
- Повысит ли это производительность, чтобы хранить более длинные последовательности отдельно?
- Последовательность может иметь алфавит белка или ДНК
- Алфавит ДНК состоит из 5 символов (A, T, C, G или -).
- Белковый алфавит будет содержать около 30 символов.
- Мы не против хранить последовательности двух разных алфавитов в разных столбцах или даже в разных таблицах. Это поможет?
Детали доступа к данным
Чтобы ответить на комментарий Иеремии Пешки:
- Последовательности белков и ДНК будут доступны в разное время
- Не нужно искать в последовательности (это делается за пределами БД)
- Будет ли эфир обращаться к отдельным строкам за раз или извлекать наборы строк по идентификаторам. Нам не нужно сканировать строки. На все последовательности ссылаются другие таблицы - в базе данных существует несколько биологически и хронологически значимых иерархий.
Обратная совместимость
Было бы неплохо иметь возможность продолжать применять следующую последовательность хеширования (SEGUID - SEquence Globally Unique IDentifier) к последовательностям.
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;