2009-09-22 89 views
0

我有一個MYSQL數據庫,其中包含大量人員的名稱。數據庫中的每個人都可以具有以下一種或全部名稱類型:第一種,最後一種,中間,少女或暱稱。我想提供一種方法讓人們搜索這個數據庫來查看數據庫中是否存在一個人。搜索名稱數據庫

是否有任何適合搜索人名數據庫的現成產品?

+0

...但這不是SQL的重點嗎?我不理解你的問題。 – 2009-09-22 02:32:39

回答

1

隨着一點巧思,MySQL將做你所需要的...下面給出了一些想法如何可以完成。

 
Your table: (I call it tblPersons) 
    PersonID (primary key of sorts) 
    First 
    Last 
    Middle 
    Maiden 
    Nick 
    Other columns for extra info (address, whatever...) 

通過保持表原樣,並且在每個名字相關的列中建立索引,下面的查詢提供了尋找他的名字相匹配莫名其妙特定名稱的所有人員的效率不高,但可行辦法。 (傑克的例子)

SELECT * from tblPersons 
WHERE First = 'Jack' OR Last = 'Jack' OR Middle = 'Jack' 
    OR Maiden = 'Jack' OR Nick = 'Jack' 

注意,應用程序並不侷限於只搜索在所有不同類型的名稱,以尋求一個名字值。用戶還可以輸入一組特定的標準,例如搜索名字'約翰'和姓氏'列儂'和專業'藝術家'(如果這樣的信息存儲在數據庫中)等。

也,請注意,即使使用這種單一表格方法,應用程序的其中一個功能可能是讓用戶告訴搜索邏輯,這是否爲「給定」名稱(如Paul,Samantha或Fatima)或「姓氏「(如Black,McQueen或Dupont)。這樣做的主要目的是有名稱可以是(例如Lewis或Hillary),並且通過在查詢中可選地指定一些名稱,最終用戶可以使用SQL自動清除許多不相關的記錄。我們將回到這種功能,在另一種更高效的數據庫佈局的背景下。

引入「名稱」表。 在tblPersons表中存儲各種名稱的替代(或另外...),我們可以引入一個額外的表。並將其與tblPersons相關聯。

tblNames 
    PersonID (used to relate with tblPersons) 
    NameType (single letter code, say F, L, M, U, N for First, Last...) 
    Name 

我們會再有tblPersons對每一個單獨的記錄,但在tblNames儘可能多的記錄,因爲他們的名字(但是,當他們沒有一個特定的名字,很少有人例如有一個暱稱,在tblNames中不需要相應的記錄)。

然後查詢將成爲

SELECT [DISTINCT] * from tblPersons P 
JOIN tblNames N ON N.PersonID = P.PersonID 
WHERE N.Name = 'Jack' 

這樣的佈局/結構將是更有效的。此外該查詢適合以輕鬆地提供「給」與「姓」的能力,只是通過向WHERE子句

 AND N.NameType IN ('F', 'M', 'N') -- for the "given" names 
    (or) 
     AND N.NameType IN ('L', 'U', 'N') -- for the "surname" types. Note that 
     -- we put Nick name in there, but could just as eaily remove it. 

該方法的另一個有趣的是它允許存儲等各種名義在在那裏,例如每個名字的SOUNDEX形式都可以在它們自己的NameType(s)下被添加,從而即使拼寫是近似的,也可以容易地找到名字。

Finaly另一個改進可能是引進含賜名(皮特·彼得,傑克·約翰,比爾·威廉等)的最常見縮寫單獨的查找表,並利用這個搜索目的(用於提供顯示值的名稱列將保留在源數據中所提供的名稱列中,但搜索級別的額外查找/標準化會增加回憶)。

+0

這實際上正是我如何擁有數據結構。我沒有意識到爲同一個字符串搜索多種類型會很容易。 – 2009-09-22 03:09:38

0

您不需要購買產品來搜索數據庫,就可以構建數據庫來處理查詢。

您是否嘗試過對自己的查詢運行?例如:(我想象的架構是什麼樣子)

SELECT * FROM names WHERE first_name='Matt' AND last_name='Way'; 

如果你已經嘗試運行一些疑問,你有沒有遇到什麼問題,讓你想嘗試不同的解決方案嗎?

模式是什麼樣的?

有多少行?

您是否嘗試過以任何方式對數據進行索引?

請提供更多信息以幫助回答您的問題。