搜索名称数据库

时间:2009-09-22 01:36:40

标签: mysql database search

我有一个MYSQL数据库,其中包含大量人员的名字。数据库中的每个人都可以拥有以下一种或所有名称类型:first,last,middle,maiden或nick。我想为人们提供一种搜索此数据库的方法,以查看数据库中是否存在某个人。

是否有适合搜索人名数据库的现成产品?

2 个答案:

答案 0 :(得分: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'

请注意,应用程序不一定只搜索要在所有各种名称类型中搜索的一个名称值。用户还可以输入一组特定的标准,例如搜索名字'John'和姓氏'Lennon'和职业'艺术家'(如果此类信息存储在数据库中)等。

另外,请注意,即使使用这种单表方法,您的应用程序的一个功能可能是让用户告诉搜索逻辑这是一个“给定”名称(如Paul, Samantha或Fatima)或 a“姓”(如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.

这种方法的另一个好处是它允许在其中存储其他类型的名称,例如,可以在它们自己的NameType(s)下添加每个名称的 SOUNDEX 形式,允许即使拼写是近似的,也很容易找到名字。

另一个改进可能是引入一个单独的查找表,其中包含给定名称的最常见缩写(Pete for Peter,Jack for John,Bill for William等),并使用此用于搜索目的(用于提供显示值的名称列将保留为源数据中提供的,但在搜索级别的额外查找/规范化将增加召回)。

答案 1 :(得分:0)

您不需要购买产品来搜索数据库,而是构建数据库来处理查询。

您是否尝试过运行自己的查询?例如:(我在想象架构是什么样的)

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

如果您尝试过运行某些查询,那么您遇到的问题会让您想尝试不同的解决方案吗?

架构是什么样的?

有多少行?

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

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