用于存储LCS信息的数据库设计?

时间:2013-10-24 12:47:23

标签: sql-server database-design relational-database lcs

我有一个包含2列的表,一个是id,另一个是包含长字符串的列 例如

Id  strings
1   AGTTAGGACCTTACTCTATATCTGTTCTGTTGGTATGGAG
2   GTACTTGTATTCTGATATCTAGGGTTTTCTAATTACTTCTG
3   GTATTCTCTTTCTAGCTGATCGTAATTAAATCTTATCTAA

当用户执行搜索时,我会在搜索字符串中找到最长的公共子序列以及表中的所有数据。 例如。搜索顺序是

  

TCTGTTCTG

1.  Its a 100% match, with the whole match found.
2.  The LCS is TCTGTTCTG, but with some gaps.
3.  The LCS is TCTGTTCT, with some gaps in BTW.

有没有办法存储有关匹配的信息,确切地说它开始找到匹配的位置,然后到达它找到匹配的位置,然后再次开始的位置,依此类推? 所以,我可以用某种格式表示数据

First one   =>

AGTTAGGACCTTACTCTATATCTGTTCTGTTGGTATGGAG
                    |||||||||
                    TCTGTTCTG

Second one =>

GTACTTGTATTCTGATATCTAGGGTTTTCTAATTACTTCTG
 | || |  |||||
 T CT G  TTCTG

基本上 以某种方式我可以为每个序列找到每个序列的开始和结束位置,这样当我将来再次显示这个页面时,我不必计算  再次匹配并可以某种方式从数据库中选择有关开始和结束的数据,并以显示的格式显示 ?我知道这个问题可能有点模糊,但请  让我知道如果你有任何疑问我还能详细说明吗?

1 个答案:

答案 0 :(得分:1)

第一种情况使用PATINDEX很容易。

案例1:

select Id, PATINDEX('%TCTGTTCTG%', strings) FROM table

这应该返回所有'完整'匹配的ID和匹配的起始位置。

案例2:

select id, PATINDEX('%T%C%T%G%T%T%C%T%G%', strings) FROM table

这个似乎返回部分匹配的值,不选择'最佳'部分匹配)

我会尽可能地回到它,从我看到的很多边缘情况。 (边缘情况:如果有多个完全匹配,你需要返回一个间隙最小的匹配或只是匹配间隙吗?部分匹配也是如此)

这应该给你一个开始,而我考虑其余部分。