2009-09-22 3 views
0

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

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

+0

... но разве это не точка SQL? Я не понимаю ваш вопрос. –

ответ

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' 

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

Также , обратите внимание, что даже при использовании этого подхода с одной таблицей одной из особенностей вашего приложения может быть предоставление пользователю указания в логике поиска, является ли это «заданным» именем (например, Пол, Саманта или Фатима) или «фамилия» « (например, Black, McQueen или Dupont). Основная цель этого заключается в том, что есть имена, которые могут быть либо (например, Льюис, либо Хиллари), и, будучи, по выбору, более конкретными в своем запросе, конечные пользователи могут получить 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' 

Такая схема/структура была бы более эффективной. Кроме того, этот вопрос позволил бы обеспечить, чтобы предложить «данную» против «фамилии» возможности легко, просто добавив к ИНЕК

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

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

+0

На самом деле это именно то, как у меня структурированы данные. Я не понял, что было бы легко найти несколько типов для одной и той же строки. –

0

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

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

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

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

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

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

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

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

Смежные вопросы