【问题标题】:Searching a database of names搜索名称数据库
【发布时间】:2009-09-22 01:36:40
【问题描述】:

我有一个 MYSQL 数据库,其中包含大量人员的姓名。数据库中的每个人都可以具有以下一种或全部姓名类型:名字、姓氏、中间名、少女或昵称。我想为人们提供一种方法来搜索这个数据库以查看数据库中是否存在一个人。

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

【问题讨论】:

  • ...但这不是 SQL 的重点吗?我不明白你的问题。

标签: mysql database search


【解决方案1】:

只要有一点独创性,MySQL 将满足您的需求......以下给出了一些如何实现的想法。

你的桌子:(我称之为 tblPersons) PersonID(各种主键) 第一的 最后的 中间 少女 缺口 其他列的额外信息(地址,不管......)

通过保持表原样,并在每个与姓名相关的列上建立索引,以下查询提供了一种低效但合理的方法来查找姓名与特定姓名以某种方式匹配的所有人姓名。 (以杰克为例)

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

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

另外,请注意,即使使用这种单表方法,您的应用程序的功能之一可能是让用户告诉搜索逻辑这是否是“给定”名称(如 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) 下,允许即使拼写是近似的,也可以轻松找到名称。

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

【讨论】:

  • 这实际上正是我构建数据的方式。我没有意识到为同一个字符串搜索多种类型会那么容易。
【解决方案2】:

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

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

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

如果您尝试运行一些查询,您遇到了什么问题让您想尝试不同的解决方案?

架构是什么样的?

有多少行?

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

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

【讨论】:

    猜你喜欢
    • 2018-05-06
    • 2022-01-03
    • 1970-01-01
    • 2018-12-19
    • 2011-10-13
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多