serge_gorshkov


Сергей Горшков - о бизнесе в сфере ИТ

о семантической интеграции, программировании, управлении...


Previous Entry Share Next Entry
Новое измерение простых вещей (о выгодах нарушения нормальной формы БД)
serge_gorshkov
Казалось бы, что может быть скучнее, чем форма редактирования чего-нибудь (свойств контакта, например) в корпоративной информационной системе? Однако, в хорошо известных вещах можно открыть новое измерение. Для этого придется нарушить кое-какие правила... что бывает не только приятно, но и полезно.



Итак, вода была невкусной... форма редактирования контакта (это событие, описывающее звонок, встречу или что-нибудь в таком роде) в CRM-системе выглядела так:


Но это только пока мы не узнали Юпи (интересно, я один помню эту рекламу из 90-х?). Реальную жизнь сложно описать такой формой, как показано выше. На самом деле, во встрече может участвовать несколько клиентов, несколько менеджеров с нашей стороны, и несколько контактных лиц со стороны каждого клиента. А еще бывает, что одно и то же контактное лицо одновременно является сотрудником сразу двух компаний клиентов (вот сегодня у меня на практике была такая встреча). Как описать такую ситуацию в "обычной" информационной системе? 99% разработчиков вам скажут, что нужно сделать три таблицы-связки, которые будут хранить пересечения контактов и клиентов, контактов и менеджеров, контактов и персон... Долго, уныло, плодит огромное количество кода, и с трудом поддается настройке через инструменты конфигурирования программы. В большинстве "простых, но удобных" CRM-систем эта задача вообще никак не решена.
Мы же, закрыв глаза и нарушив нормальную (даже не помню, какую по счету) форму таблицы, уместили все это в одну-единственную таблицу БД, и даже обошлись без хаков типа "склеивания" нескольких значений в одну ячейку. Все это реализовано в общем виде, легко применяется к любым таблицам (и настраивается через администраторский интерфейс CRM), не требует ни грамма хардкода, а главное - работает! Практически само! Даже выпадающий список контактных персон начинает сам собой выводить объединение списков контактных персон двух клиентов, после выбора дополнительного клиента. А форма редактирования контакта теперь выглядит так (группы полей для наглядности выделены красной линией, которой на самом деле в форме нет):


По-моему, это просто красиво. В смысле, элегантно, как программное решение.





  • 1
Вода была прозрачной, без вкуса, без цвета, без запаха... И нафига ты напомнил про эту рекламу, тепреь будет в голове весь день мотивчик крутиться. :)

Даже в своей небольшой практике столкнулась с тем, что денормализация часто приносит привес производительности.

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

В итоге у клиентов появилось текстовое поле "менеджеры", куда дублировались ФИО прикрепленных к записи менеджеров, на таблице связности - триггеры, обрабатывающие это поле. В итоге фильтрация и сортировка ведется по этому дополнительному полу со списком менеджеров, а всё остальное (прикрепление-отекрепление и проверка прав) - по таблице связности. Практика показала, что решение удовлетворяет все потребностям задачи.

Ну да... производительность достигается за счет кэширования, кэширование в БД - это всегда избыточность данных, а строятся кэши в БД почти всегда триггерами.
Триггерами вообще можно перевернуть мир. А подавляющее большинство веб-программистов о них и знать не знает. В том числе потому, что работают с какой-нибудь ORM. Но тут мы уже переходим к теме моего доклада на предстоящем 21 апреля Дне открытых дверей нашей компании - а для этого будет отдельный пост :)

  • 1
?

Log in

No account? Create an account