2013-10-24 50 views
1

我有一個表,其中包含2列,一個是一個ID,其他是包含長字符串的列 例如。用於存儲LCS信息的數據庫設計?

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

第一種情況使用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 

這一個似乎對部分匹配返回一個值,不選擇「最佳」部分匹配)

將回到它的時候我可以,很多邊緣我看到的情況。 (邊緣情況:如果有多個完全匹配,你需要返回一個間隙最少的匹配還是間隙匹配?部分匹配也是如此)

這應該給你一個開始,而我想到其餘的。

相關問題