Я поставлю свой голос на стороне использования несвязанной формы для сбора обязательных полей и представления возможных дубликатов. Вот пример из недавнего приложения:
(источник: dfenton.com )
(я отредактировал имена реальных людей и вставил поддельные, а сглаживание моей графической программы отличается от ClearType, отсюда и странность)
Идея здесь заключается в том, что пользователь помещает данные в любое из четырех полей (не требуется для всех из них) и нажимает кнопку ДОБАВИТЬ. В первый раз он заполняет возможные совпадения. Затем пользователь должен решить, является ли одно из совпадений предполагаемым лицом или нет, и либо снова щелкнуть «ДОБАВИТЬ» (чтобы добавить его, даже если это дубликат), либо нажать кнопку внизу, чтобы перейти к выбранному клиенту.
Цветные индикаторы предназначены для указания того, насколько близко совпадение. В этом случае введенный адрес электронной почты является точным совпадением для первого лица в списке, и точное совпадение по электронной почте само по себе считается точным совпадением. Кроме того, в этом конкретном приложении клиент хочет свести к минимуму количество человек, входящих в одну компанию (это характер их бизнеса), поэтому точное совпадение в организации считается частичным совпадением.
В дополнение к этому, есть сопоставление с использованием Soundex, Soundex2 и Simil, а также подстрок и подстрок в сочетании с Soundex / Soundex2 / Simil. В этом случае вторая запись является дубликатом, но Soundex и Soundex2 не улавливают его, в то время как Simil возвращает сходство на 67%, и я установил чувствительность более 50%, поэтому «Wightman» отображается как закрытый Матч с "Whiteman". Последний из всех. Я не уверен, почему последние два в списке, но, очевидно, есть некоторые причины для этого (вероятно, Simil и инициалы).
Я управляю именами, компанией и электронной почтой через процедуры подсчета очков, а затем использую комбинацию для вычисления окончательного результата. Я храню значения Soundex и Soundex2 в каждой записи о человеке. Simil, конечно, нужно вычислять на лету, но он работает нормально, потому что оптимизатор запросов Jet / ACE знает, что нужно ограничивать другие поля, и, таким образом, вызывает Simil для значительно сокращенного набора данных (это на самом деле первое приложение Я использовал Simil для, и пока он отлично работает).
Требуется небольшая пауза для загрузки возможных совпадений, но она не слишком медленная (приложение, из которого взята эта версия, имеет около 8K существующих записей, с которыми тестируется). Я создал этот дизайн для приложения, имеющего 250 тыс. Записей в таблице person, и оно работало очень хорошо, когда серверная часть была все еще Jet, и все еще прекрасно работает после того, как серверная часть была обновлена до SQL Server несколько лет назад.