在PostreSQL中存储UniProt生物序列的最佳方法是什么?
资料明细
- 我们从UniProt中提取了1200万个序列-这个数字很可能每3-10个月增加一倍。
- 序列的长度可以从10到500亿个字符不等
- 少于1%的序列超过1万个字符
- 单独存储较长的序列是否会提高性能?
- 序列可以是蛋白质或DNA字母
- DNA字母有5个字符(A,T,C,G或-)。
- 蛋白质字母将包含大约30个字符。
- 我们不介意将两个不同字母的序列存储在不同的列甚至不同的表中。有帮助吗?
数据访问详细信息
回答耶利米·佩斯卡的评论:
- 蛋白质和DNA序列将在不同时间访问
- 无需在序列中搜索(在db之外完成)
- 以太会同时访问单个行还是通过ID提取行集。我们不需要扫描行。所有序列都由其他表引用-数据库中存在几个在生物学和时间上有意义的层次结构。
向后兼容
能够继续将以下哈希函数(SEGUID-SEquence全局唯一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;