автоматизация SQL-соединений с использованием Perl - PullRequest
3 голосов
/ 27 декабря 2010

У меня есть интерфейсное веб-приложение, которое запрашивает базу данных MySQL и представляет пользователю запрошенные данные. База данных содержит 25 таблиц; есть внешние ключи, относящиеся к таблицам. Проблема здесь в том, что пользователи совершенно не знакомы с SQL; Я не могу ожидать, что они присоединятся к столам.

Я хочу написать скрипт, который генерирует соединения автоматически. Я хочу знать, есть ли в Perl какие-либо модули, облегчающие эту задачу?

Мой собственный опыт работы с SQL - всего несколько месяцев. Пожалуйста, дайте мне знать ваше мнение по этому поводу.

Ответы [ 2 ]

2 голосов
/ 27 декабря 2010

Я не знаю ни одного модуля, который делает это в общем, и его создание очень нетривиально.Проблемы варьируются от сопоставления того, какие первичные / внешние ключи совпадают (они не всегда называются одинаковыми), до того, как обращаться со значениями NULL (внутренними или внешними объединениями?), До обеспечения того, что полный набор таблиц даже полностью совместим.

Кроме того, по крайней мере в Sybase (не уверен в MySQL), есть углы оптимизации производительности для выполнения этого автоматически, которые не являются тривиальными, даже если вы получаете правильные данные.

Чтобы быть идеальноЧестно говоря, вместо этого я бы сделал следующее:

  • Прежде всего, принудительно зарегистрируйте определение данных в конфигурации (включая таблицы, столбцы, первичные и внешние ключи иприсоединяемость к внутренним / внешним соединениям).

  • Разделение между "основными" таблицами и таблицами "обогащения".

    Таблица обогащения - это таблица, единственная цель которойдолжен быть присоединен по своему первичному ключу к некоторым из основных таблиц, чтобы добавить больше столбцов к каждой строке, извлеченной из основных таблиц (я бы сказал, что не долженбыть в любом месте, где эти таблицы, за исключением объединений, чтобы упростить жизнь).В качестве примера рассмотрим условную библиотечную базу данных.Таблица «обзоры» будет таблицей «обогащения» - вы используете эти данные только для обогащения информации о книге, а не для запроса.Таблица «patrons» также будет (для определенных бизнес-применений) «таблицей обогащения», просто для объединения имени / адреса patron_id в другой таблице.

  • Для основных таблиц не забудьтепользователи строят запрос.Просто перечислите КАЖДЫЙ отдельный запрос, который они могут захотеть выполнить для бизнес-сценариев (большинство возможных объединений просто не имеют смысла / не должны выполняться);затем для каждого сценария напишите ОЧЕНЬ понятное и понятное описание того, что они выбирают, а затем оптимизированный запрос к основным таблицам для этого сценария.Кроме того, для каждого из этих постоянных запросов создайте список FOREIGN-ключей, выбранных в этом запросе, которые могут быть полезны пользователям для обогащения из таблиц обогащения.(например, если в каком-либо запросе выбрано поле «patron_id», вы добавляете «patrons» в качестве возможных дополнительных данных в списке)

  • Затем разрешите своим пользователям в графическом интерфейсе выбрать конкретный сценарий использования,Найдите постоянный запрос, соответствующий этому сценарию.Затем отобразите возможные варианты обогащения (включите адрес патрона? Y / n?).Добавить эти дополнительные объединения обогащения в предварительно подготовленный запрос довольно просто.

0 голосов
/ 27 декабря 2010

Мой лучший совет - проанализировать ввод пользователя через приложение переднего плана, а затем использовать его для анализа запросов для Perl DBI .

...