коррекция базы данных - insurance, banking

User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

коррекция базы данных - insurance, banking

Post by Sabina »

Если кто работал/работает с базой данных для insurance/banking, проконсультируйте, пожалуйста, какие есть алгоритмы/тулы/методики поддержания такой базы в форме? Имеется в виду скорее data consistency и up-to-date, а не оптимизация CУБД и модели.

То есть речь идет а базе, где данные по клиентам увязаны с их адресами и идет массовая отправка почты на регулярной основе.
В той конторе, где я работаю, на "чистку" базы уходит много ручного руда, вот и подумалось, что наверняка уже есть какие-то наработки в этой сфере.
Интересно какой обычно выбор технологий для таких приложений, учитывая, что в день обрабатываются десятки тысяч записей... Ну или на худой конец насколько комбинация VB + MS SQL - оптимальна для такой задачи.

В базах такого плана неизбежны несоответствия адресов, потому что фирмы и люди каждый день перезжают, бизнесы раззоряются, происходят mergers и так далее. Плюс объективные ошибки за human factor (люди делают ошибки) + ошибка сканирования.

На данный момент программа автоматически сопоставляет вновь поступившие данные с уже существующими и где есть 100%-ый match адреса, сразу делается увязка по parent key с уже существующей в базе данных записью.
Оставшиеся данные обрабатываются операторами, при этом если не найдено аналогов в базе, в качестве parent key этой записи присваивается ее же собственное child key.
Работа оператора тоже немного автоматизирована, ибо он на сам просматривает всю базу, а программа ему уже подбирает подходящие записи, при этом проводя match по любым параметрам (имя, стрит адрес, город, штата, зип).
Учитывая качество работы программы :( и количество записей per оператор per hour, база в итоге все равно достаточно захламлена.
Как с этим борются в других местах? Не думаю, что все чиститься вручную.


Еще один вопрос: насколько трудно добавить в VB кнопку, которая могла бы прервать загрузку всего списка записей с аналогичным именем из базы данных для match с current record? Есть списки, которые грузятся минуты, а бывает с первого взгляда на запись можно понять куда ее приписать, то есть вообще нет необходимости просмотра этого списка . А приходится ждать пока весь список загрузится во вспомогательном окне и потом уже можно что-то сделать. Теряется львиная доля рабочего времени..

Спасибо,
Сабина
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

У меня сегодня deja vu, в сосенднем топке спрашивают про базу ролей (точно как сейчас на работе)
А когда я работатл два месяца на висконсинщине, то там занимался matching базы PeopleSoft и еще одной. Сличал клиентов
По информации о клиенте она либо находила соответствие автоматом
Либо программа на VB находила best match и предлагала список альтернатив :)
Ничего не напомнет ?

По поводу первой части чтобы уменьшить объем работы то только улучшать автоматический алгоритм
Сядьте за спиной оператора и набирайте статистику, что различается в информации клиентов изза чего происходит расхождение
Ну или не за спиной а посмотрите в базе результат их раоты

По повду второй части
Если бы список возможных альтернативных вариантов готовился stored proc или одним select, то операор бы просто ждал не видя ничего, а потом сразу бы увидел весь список
Следовательно у Вас есть какой то цикл по записям. А цикл можно прервать
С другой стороны вероятно именноптому список подготавлявается долго
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

Dmitry67 wrote:По информации о клиенте она либо находила соответствие автоматом Либо программа на VB находила best match и предлагала список альтернатив :) Ничего не напомнет ?


Да я уже давно поняла, что немалая часть успешных американских бизнесов базируется на софте, идею которого хозяин спер с предидущего места работы :mrgreen:

Dmitry67 wrote:Сядьте за спиной оператора и набирайте статистику, что различается в информации клиентов из-за чего происходит расхождение


Дима, я сама тем оператором сейчас работаю part time, а насчет алгоритма, если бы мне в него только дали глянуть краешком глаза... Собственно я пытаюсь найти причину по которой мне бы дали на это дело посмотреть. Ну скажем, если бы примерно представлять что может вызывать имеющиеся на данный момент проблемы, то можно это аргументированно объяснить боссу и попробовать получить допуск к коду.

А проблемы там вот какого плана:
1) Match иногда просто не срабатывает. На днях стали проглядывать базу ( это как бы и не входит ни в чьи обязанности) и нашли там кучу записей, которые почти идентичны (отличаются на две точки), а система их совсем не за-match-ила, даже как "likely" или "probable" (терминология ничего не напоминает :wink: )... .

2) Система позволяет reassigning of parent ID для целой группы записей, но при этом она совершенно не предупреждает о том, что если к самим этим записям тоже было что-то приписано в качестве childID, то оно после такого re-assign уйдет в никуда. По идее она вообще трехуровневую иерархию не должна разрешать.. Но тут я мало пока видела, надо подольше понаблюдать.

Dmitry67 wrote:По поводу второй части Если бы список возможных альтернативных вариантов готовился stored proc или одним select, то операор бы просто ждал не видя ничего, а потом сразу бы увидел весь список
Следовательно у Вас есть какой то цикл по записям. А цикл можно прервать
С другой стороны вероятно именно поэтому список подготавлявается долго


Так и есть, оператор ничего не видит в "likely" кроме hourglass-es и потом через пару-тройку минут вываливается весь список. Но он часто уже видит нужный номер в parent list, так что необходимости в загрузке всего этого листа может и не быть.

Значит это все-таки procedure или один select и прервать это дело не получиться?
Но даже если этот список все равно кажды раз загружать, так ведь очевидно, что оператору тысячи строк единовременно для анализа не нужны...Зачем их все на экран загружать? Дал сотню best matches и хватит....

Спасибо, Дима. Мне ваши комментарии помогли, понаблюдаю еще пару недель и решусь пожалуй высказаться...

И все-таки очень важный вопрос так и остался неотвеченным. Насколько Visual Basic scalable решение для данного случая?

Сабина
User avatar
JustMax
Уже с Приветом
Posts: 1476
Joined: 05 Dec 2000 10:01
Location: Vilnius -> Bonn

Post by JustMax »

Не знаю поможет ли вам это - но мы делали так
Строка ввода "нормализовалась" при записи с учетом языка (перевод в верхний регистр, убирание знаков препинания и лишних пробелов, разбивание на лексемы и слоги и т.д.). Алгоритм был достаточно сложный. Нормализованная строка сохранялась в других колонках в специальной таблице и по ним строились индексы. После этого любая строка введеная для поиска для начала "нормализовалась" по тому же алгоритму и выполнялись несколько поисковых запросов в разной комбинации. Результирующие наборы обьеденялись и им присваивалась различная степень достоверности. Лучшие результаты выдывались оператору. Очень помогло, что, в группе работал человек хорошо знакомый с теорией нечеткой логики (он и создавал самые сложные алгоритмы). Вообщем процент попадания был очень высок.

Пример

Оригинал
Rotgrave Avenue 12-25.

И для ввода
Rotave Avnue 125

оригинал 100% попадал в best matches.
Оверхеад правда был высок - но в том проекте он окупался.
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

По поводу VB
Если он нуже для вывода и выбора вариантов то почему нет ? Вариантов немного, подбирает их сервер
А вот если VB сам их подбирает по одному тыды ой :)
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

JustMax wrote:Не знаю поможет ли вам это - но мы делали так
Строка ввода "нормализовалась" при записи с учетом языка (перевод в верхний регистр, убирание знаков препинания и лишних пробелов, разбивание на лексемы и слоги и т.д.). Алгоритм был достаточно сложный. Нормализованная строка сохранялась в других колонках в специальной таблице и по ним строились индексы. После этого любая строка введеная для поиска для начала "нормализовалась" по тому же алгоритму и выполнялись несколько поисковых запросов в разной комбинации. Результирующие наборы обьеденялись и им присваивалась различная степень достоверности. Лучшие результаты выдывались оператору. Очень помогло, что, в группе работал человек хорошо знакомый с теорией нечеткой логики (он и создавал самые сложные алгоритмы). Вообщем процент попадания был очень высок.

Пример

Оригинал
Rotgrave Avenue 12-25.

И для ввода
Rotave Avnue 125

оригинал 100% попадал в best matches.
Оверхеад правда был высок - но в том проекте он окупался.


У них алгоритм тоже не совсем тривиальный, но явно проще того, что вы описали. У них и запросы к performance другие, каждый день нужно ftp-тые до 10 утра на сервер файлы (десятки тысяч рекордов) обработать, отослать электронно, плюс распечатать то, что нужно послать в бумажном виде и полностью подготовить к отправке до 3 pm.

Та ошибка, когда машина не увязала явно похожие записи - это явный баг. Обычно она делает достаточно sophisticated match, а тут пропустила точки, типа "PO 45567, San Diego, CA" и "P.O. 45567, San Diego, CA"

Про алгоритм я знаю, что она начинает сопоставлять начиная с ZIP-а и вниз до street address и name. Причем если и в имени 2 слова совпали (напирмер "financial corp.")- попадает в probable. В это списке каждой записи присваивается приоритет в зависимости от того насколько точны совпадения и в каком из полей по счету это совпадение. Потом сам этот список можно отсортировать по любому из полей.
В likely кидается все подряд, что похоже по какому-бы ни было полю. Тоже можно сортировать. Приоритетов там насколько я вижу нет.

В любом случае мне кажется тут есть место для дальнейшего foolproofing, надо только грамотно обосновать.

JustMax, а ваша система на Java была? Не расскажите чуть поподробнее на чем все было реализовано?

Спасибо,
Сабина
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

Dmitry67 wrote:По поводу VB
Если он нуже для вывода и выбора вариантов то почему нет ? Вариантов немного, подбирает их сервер
А вот если VB сам их подбирает по одному тыды ой :)


Если все на сервере, как могло получиться так, что сервер пропустил (все или почти все!) явные матчи в одном отдельно взятом случае?
Это что неверно написанная процедура 8O ?

Сабина
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Sabina, явных ошибок в SQL server нет
Слишком активно юзают
Конечно бага какая нибудь
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

Dmitry67 wrote:Слишком активно юзают
Конечно бага какая нибудь


Вот-вот, я и говорю надо на Джаву переписать :mrgreen:

Сабина
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Sabina, не стоит без лишней надобности выносить обработку с сервера
Понятно если обработка изображени или перевод
А тут же просто обработка строк
Никто быстрее сиквела эту обраотку не сделает
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
JustMax
Уже с Приветом
Posts: 1476
Joined: 05 Dec 2000 10:01
Location: Vilnius -> Bonn

Post by JustMax »

Sabina wrote:JustMax, а ваша система на Java была? Не расскажите чуть поподробнее на чем все было реализовано?

Спасибо,
Сабина


Нет не на Java - тогда на Java только только апплеты писать начинали.
В основном Oracle, PL/SQL (хороший язык кстати ИМО), Oracle Forms.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: коррекция базы данных - insurance, banking

Post by Sabina »

Мне пришла в голову интересная идея на предмет корректировки базы (см. первый пост). На этот раз корректировки именно адресов.

Когда отправленное письмо возвращается N- раз - по нему проводиться research на предмет поиска правильного адреса. Делается это все карандашиком на конвертике, одни ищут в И-нете возможные телефоны, другие обзванивает фирмы, узнают правильный адрес и потом правят в базе. При этом все далается как бог на душу положит, потому что никаких queue и сроков по такой корректировке нет.

А что если сделать отдельную базу ( на том же sql сервере) и туда выдергивать рекорды из основной базы, которые требуют корректировки. Буквально 3-4 колонки (parentID, childID, name, address) . К ним добавить колонку с комментариями и флагами ( для этапов корректировки). Таким образом все лица, имеющие отношение к корректировке адресов будут иметь свою собственную queue и над ней работать каждый день. А результат, то есть правильный адрес будет потом передаваться обратно в основную базу.

По-моему это совсем несложно реализовать. В части базы уж точно, да и ГУЙ простенький: корректировать одну колонку и добавлять комментарии.

Не знаю правда насколько проста эта идея с синхронизацией записей по одной колонке и насколько большой overhead эта дополнительная база может создать на сервере. Правку обычно делают во второй половине дня после основной обработки. Так что они не пересекаются можно сказать.

Как всегда мнения very appreciated,
Сабина

Return to “Вопросы и новости IT”