2009-08-19 19 views
0

檢索詞我有三個表關於與SQL

[USER] --Master user table 
[KEYWORD] --Master keyword table 
[USER_KEYWORD] --[USER]-[KEYWORD] mapping table 

以下最佳做法是在我的數據庫結構

GO 
--master user table 
CREATE TABLE [USER] 
(
    [USERID] INT IDENTITY, 
    [NAME] VARCHAR(50) 
) 
GO 

--master keyword table 
CREATE TABLE [KEYWORD] 
(
    [KEYWORDID] INT IDENTITY, 
    [KEYWORD] VARCHAR(50) 
) 

GO 
--x table user_keyword 
CREATE TABLE [USER_KEYWORD] 
(
    [USERID] INT , 
    [KEYWORDID] INT 
) 

GO 
--Insert data in master user table 
INSERT INTO [USER] 
SELECT 'TESTUSER1' 
UNION ALL 
SELECT 'TESTUSER2' 
UNION ALL 
SELECT 'TESTUSER3' 
UNION ALL 
SELECT 'TESTUSER4' 

GO 
--Insert data in master keyword table 
INSERT INTO [KEYWORD] 
SELECT 'ASP' 
UNION ALL 
SELECT 'ASP.NET 3.5' 
UNION ALL 
SELECT 'C#' 
UNION ALL 
SELECT 'JAVA' 
UNION ALL 
SELECT 'ASP.NET' 
UNION ALL 
SELECT 'SQL' 
UNION ALL 
SELECT 'SQL SERVER' 
UNION ALL 
SELECT 'SQL SERVER 2005' 
UNION ALL 
SELECT 'SQL SERVER 2008' 

GO 

--Insert data in user keyword table 

INSERT INTO [USER_KEYWORD] 
SELECT 1,1 
UNION ALL 
SELECT 2,2 
UNION ALL 
SELECT 3,3 
UNION ALL 
SELECT 4,4 
UNION ALL 
SELECT 1,2 
UNION ALL 
SELECT 2,3 
UNION ALL 
SELECT 3,4 
UNION ALL 
SELECT 4,1 
UNION ALL 
SELECT 2,3 
UNION ALL 
SELECT 3,4 
UNION ALL 
SELECT 4,6 
UNION ALL 
SELECT 3,6 
UNION ALL 
SELECT 4,6 
UNION ALL 
SELECT 2,7 
UNION ALL 
SELECT 3,8 
UNION ALL 
SELECT 4,9 

GO 


CREATE PROC TEST_SEARCH_KEYWORDS 
@SEARCHKEYWORD VARCHAR(50) 
AS 
BEGIN 

    SELECT K.[KEYWORD],COUNT(UK.[KEYWORDID]) AS [KEWWORDCOUNT] FROM [KEYWORD] K 
    INNER JOIN [USER_KEYWORD] UK 
    ON K.[KEYWORDID]=UK.[KEYWORDID] 
    WHERE K.[KEYWORD] LIKE (@SEARCHKEYWORD+ '%') 
    GROUP BY K.[KEYWORD] 

END 


--TEST EXAMPLES 

EXEC TEST_SEARCH_KEYWORDS 'ASP' 
--0UTPUT 
KEYWORD           KEWWORDCOUNT 
-------------------------------------------------- ------------ 
ASP            2 
ASP.NET 3.5          2 


--TEST EXAMPLES 

EXEC TEST_SEARCH_KEYWORDS 'SQL' 
--0UTPUT 
KEYWORD           KEWWORDCOUNT 
-------------------------------------------------- ------------ 
SQL            3 
SQL SERVER           1 
SQL SERVER 2005         1 
SQL SERVER 2008         1 

我有一個SP命名TEST_SEARCH_KEYWORDS基於關鍵字來搜索記錄中是從外面提供的。目前我正在使用像條件中的s​​p。我想知道,這將是很好的從數據庫使用像搜索記錄,因爲在將來我的記錄將繼續增加。我不想使用全文搜索 因爲我必須應付sql server 2000也。

回答

0

其中一個(需要存儲的)解決方案是預先計算並存儲與實際關鍵字本身一起的數字關鍵字。然後基於外觀標準,您可以在相關的前綴列(如果存在)上進行直接的平等比較,或者返回執行「類似」比較。

例如,假設強制搜索詞必須包含至少3個字符的限制。您可以創建列Prefix3Chars,Prefix4Chars,Prefix5Chars。假設用戶輸入搜索詞「你好」,並且你的數據庫包含關鍵詞「你好,世界」。您將選擇在Prefix5Chars列上進行搜索並匹配關鍵詞「Hello,World」。如果用戶使用關鍵詞「你好,W」執行搜索,則會回退到使用「like」進行搜索。

1

,如果你繼續搜索,如:

WHERE K.[KEYWORD] LIKE (@SEARCHKEYWORD+ '%') 

那麼你的查詢將使用索引,並且應該仍然執行以及表的增長。但是,如果將其更改爲:

WHERE K.[KEYWORD] LIKE ('%'+ @SEARCHKEYWORD+ '%') 

那麼就不會,它會爲你的表的增長表掃描,這會導致糟糕的表現。