2009-08-19 16 views
0

Ich habe drei TabellenBest Practice in Bezug auf Such Keywords mit SQL

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

Unten ist die Struktur in meinem db

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 

Ich habe ein sp TEST_SEARCH_KEYWORDS namens Datensätzen zu suchen, basierend auf Schlüsselwörter, wird von draußen zur Verfügung gestellt. Zur Zeit verwende ich wie Zustand in sp. Ich will wissen, dass das gut ist, um Aufzeichnungen von der Datenbank zu suchen, die verwendet, wie in Zukunft meine Aufzeichnungen weiter zunehmen werden. Ich will nicht Volltextsuche verwenden, weil ich mit sql Server 2000 auch fertig werden muss.

Antwort

0

Eine (speicherhungrige) Lösung wäre die Vorberechnung und Speicherung eines Zahlenschlüsselworts neben dem eigentlichen Schlüsselwort. Dann würden Sie basierend auf den Look-Kriterien einen direkten Gleichheitsvergleich für die relevante Präfixspalte (falls vorhanden) durchführen oder aber auf einen ähnlichen Vergleich zurückgreifen.

Nehmen wir beispielsweise an, dass ein Grenzwert für das Suchwort mindestens 3 Zeichen enthalten muss. Sie könnten Spalten Prefix3Chars, Prefix4Chars, Prefix5Chars erstellen. Nehmen wir an, der Benutzer gibt das Suchwort "Hello" ein und Ihre Datenbank enthält ein Schlüsselwort "Hello, World". Sie würden wählen, in der Prefix5Chars-Spalte zu suchen und würden mit dem Schlüsselwort "Hello, World" übereinstimmen. Wenn der Benutzer eine Suche mit dem Schlüsselwort "Hallo, W" durchgeführt hat, würden Sie auf die Suche mit "Gefällt mir" zurückgreifen.

1

wenn Sie halten die Suche wie:

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

dann Ihre Abfrage einen Index verwenden, und sollte noch gut funktionieren wie die Tabelle wächst. Wenn Sie jedoch, es zu ändern:

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

dann wird es nicht, und es Tabellenscan wird, die schlechte Leistung verursachen wird als Tabelle wächst.