Поиск в базе данных имен - PullRequest
       12

Поиск в базе данных имен

0 голосов
/ 22 сентября 2009

У меня есть база данных MYSQL, содержащая имена большой коллекции людей. Каждый человек в базе данных может иметь один или все из следующих типов имен: первый, последний, средний, девичья или ник. Я хочу, чтобы люди могли искать в этой базе данных, чтобы узнать, существует ли человек в базе данных.

Существуют ли какие-либо готовые продукты, подходящие для поиска в базе данных имен людей?

Ответы [ 2 ]

1 голос
/ 22 сентября 2009

С некоторой изобретательностью 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'

Обратите внимание, что приложение не ограничивается поиском только одного значения имени для поиска во всех различных типах имен. Пользователь также может ввести определенный набор критериев, например, для поиска имени «Джон» и фамилии «Леннон» и профессии «художник» (если такая информация хранится в БД) и т. Д.

Кроме того, обратите внимание, что даже при таком подходе к одной таблице одна из возможностей вашего приложения может заключаться в том, чтобы позволить пользователю сообщать логике поиска, является ли это «заданным» именем (как у Павла, Саманты или Фатима) или «фамилия» (например, Блэк, МакКуин или Дюпон). Основная цель этого заключается в том, что существуют имена, которые могут быть либо (например, Льюис или Хиллари), и, будучи опционально немного более точными в своем запросе, конечные пользователи могут получить SQL для автоматического отсеивания многих не относящихся к делу записей , Мы вернемся к такого рода функциям в контексте альтернативного, более эффективного макета базы данных.

Представляем таблицу имен. Вместо (или в дополнение ...) хранения различных имен в таблице 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 для каждого имени под их собственным именем (типом), что позволит легко найти имена, даже если написание приблизительное.

Наконец, еще одним улучшением может быть введение отдельной справочной таблицы, содержащей наиболее распространенные сокращения имен (Пит для Питера, Джек для Джона, Билл для Уильяма и т. Д.), И использование этого для целей поиска (столбцы имен, используемые для предоставления отображаемых значений, останутся такими же, как в исходных данных, но дополнительный поиск / нормализация на уровне поиска увеличит отзыв).

0 голосов
/ 22 сентября 2009

Вам не нужно покупать продукт для поиска в базе данных, базы данных созданы для обработки запросов.

Вы пытались запустить свои собственные запросы к нему? Например: (я представляю, как выглядит схема)

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

Если вы попытались выполнить несколько запросов, с какими проблемами вы столкнулись, если вы хотите попробовать другое решение?

Как выглядит схема?

Сколько там строк?

Вы пытались индексировать данные каким-либо образом?

Пожалуйста, предоставьте дополнительную информацию, чтобы помочь ответить на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...