2009-09-22 88 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'; 

如果你已经尝试运行一些疑问,你有没有遇到什么问题,让你想尝试不同的解决方案吗?

模式是什么样的?

有多少行?

您是否尝试过以任何方式对数据进行索引?

请提供更多信息以帮助回答您的问题。