Языки кроме SQL в postgres
В последнее время я немного использую PostgreSQL, и одна из вещей, которые мне нравятся, это то, что вы можете использовать языки, отличные от SQL, для функций сценариев и так далее. Но когда это действительно полезно?
Например, в документации сказано, что основное использование PL/Perl - это то, что он довольно хорош в манипулировании текстом. Но разве это не то, что должно быть запрограммировано в приложении?
Во-вторых, есть ли веская причина использовать ненадежный язык? Кажется, что сделать так, чтобы любой пользователь мог выполнить любую операцию, было бы плохой идеей в производственной системе.
PS. Бонусные баллы, если кто-то может сделать PL/LOLCODE полезным.
7 ответов
"Разве это не [манипулирование текстом] больше того, что должно быть запрограммировано в приложении?"
Обычно да. Общепринятый " трехуровневый" дизайн приложения для баз данных говорит о том, что ваша логика должна быть на среднем уровне, между клиентом и базой данных. Однако иногда вам требуется некоторая логика в триггере или индексация функции, требующая помещения некоторого кода в базу данных. В таком случае все обычно "какой язык мне использовать?" возникают вопросы
Если вам нужна лишь небольшая логика, вероятно, следует использовать наиболее переносимый язык (pl/pgSQL). Если вам нужно заняться серьезным программированием, вам лучше использовать более выразительный язык (возможно, pl/ruby). Это всегда будет призыв к суждению.
"Есть ли веская причина использовать ненадежный язык?"
Как и выше, да. Опять же, лучше всего использовать прямой доступ к файлам (например) на вашем среднем уровне, когда это возможно, но если вам нужно отключить работу на основе триггеров (для которых может потребоваться доступ к данным, недоступным непосредственно для вашего среднего уровня), то вам не нужно доверять языки. Это не идеально, и его вообще следует избегать. И вам обязательно нужно охранять доступ к нему.
@Mike: такое мышление заставляет меня нервничать. Я много раз слышал, что "это должно быть бесконечно переносимо", но когда задают вопрос: действительно ли вы предвидите, что будет какое-либо портирование? ответ - нет.
Придерживание наименьшего общего знаменателя может реально снизить производительность, равно как и введение уровней абстракции (ORM, PHP PDO и т. Д.). Мое мнение это:
- Оцените реалистично, если есть необходимость поддержки нескольких РСУБД. Например, если вы пишете веб-приложение с открытым исходным кодом, есть вероятность, что вам по крайней мере необходимо поддерживать MySQL и PostgreSQL (если не MSSQL и Oracle)
- После оценки максимально используйте платформу, которую вы определили
И кстати: вы смешиваете реляционные базы данных с нереляционными (например, CouchDB не является СУБД, сравнимой с Oracle), еще раз иллюстрируя тот факт, что предполагаемая потребность в переносимости много раз сильно преувеличивается.
Ненадежные версии процедурных языков позволяют получить доступ к операциям ввода-вывода в системе. Это может пригодиться, если вам нужен триггер или что-то еще, отправьте электронное письмо или подключитесь к серверу сокетов, чтобы отправить всплывающее уведомление. Существует множество вариантов использования этого типа вещей, и из-за уровней изоляции postgresql вы можете безопасно делать такие вещи. Вы можете установить контрольные точки в функции, чтобы в случае сбоя транзакции электронная почта или что-либо еще не вышло. Хорошая вещь в этом состоит в том, что он удаляет логику с клиента и помещает ее на сервер.
В наши дни любая "уникальная" или "классная" функция в СУБД вызывает у меня невероятную нервозность. Я начинаю сыпь и вынужден прекратить работу, пока зуд не исчезнет.
Я просто ненавижу быть без необходимости привязанным к платформе. Предположим, вы собрали большую часть вашей системы в PL/Perl внутри базы данных. Или в C# в SQL Server, или в PL/SQL в Oracle, есть множество примеров *.
Теперь вы внезапно обнаруживаете, что выбранная вами платформа не масштабируется. Или не достаточно быстро. Или что-то. Хуже того, в блоке базы данных есть новый ребенок (что-то вроде MonetDB, CouchDB, Cache, скажем, намного круче), который решит все ваши проблемы (даже если ваша единственная проблема, как у меня, - это неохлаждаемая платформа для базы данных). И вы не можете переключиться на него, не перекодировав половину своего приложения.
(* По общему признанию, оплаченные продукты в некоторой степени стремятся заблокировать вас, убеждая вас использовать их уникальные функции, что не является обвинением, которое может быть напрямую направлено на бесплатных провайдеров, но эффект тот же).
Так что разглагольствует первая часть вопроса. Сердечный, хотя.
есть ли веская причина использовать ненадежный язык? Кажется, что сделать так, чтобы любой пользователь мог выполнить любую операцию, было бы плохой идеей.
Боже мой, да, это так! Этакая "атака с помощью Perl"? Почти стоило бы сделать это, просто чтобы посмотреть, что произойдет, подумал бы я.
По философским причинам, изложенным выше, я думаю, что передам вызов PL/LOLCODE. Хотя я был несколько удивлен, обнаружив, что это была ссылка на что-то существующее.
С моей точки зрения, я думаю, что ответ "это зависит".
Существует аргумент, что манипулирование данными относится к уровню базы данных, поэтому бизнес-логике не нужно чрезмерно беспокоиться о том, как происходит манипуляция, она просто знает, что она имеет.
Еще одна очень веская причина для обработки данных на уровне базы данных - это то, что объем обрабатываемых данных означает, что пропускная способность сети станет проблемой. Однажды мне пришлось классифицировать очень большие объемы данных. Обработка этого на уровне приложений была строго ограничена временем, необходимым для передачи всех данных по сети для обработки.
Затем я написал алгоритм биннинга в PL/pgSQL, и он работал намного быстрее.
Что касается ненадежных языков, я услышал подкаст от Джоша Беркуса (адвоката postgres), который обсуждал приложение postgresql, которое вводило данные из MySQL в рамках его обработки, так что само сообщение обрабатывалось сервером postgres. Я не помню всех подробностей, я думаю, что это был подкаст FLOSS Weekly, который является довольно интересным обсуждением истории PostGRESQL и некоторых проблем, с которыми он сталкивается.
Я думаю, что большинство дополнительных языков предлагаются для того, чтобы при регулярной разработке на этом языке вы могли чувствовать себя комфортно при написании функций БД, триггеров и т. Д. Полезность этих функций заключается в обеспечении контроля над данными, максимально приближенными к данным. возможный.
Примером полезной хранимой процедуры, которую я недавно написал на внешнем языке, которая была бы невозможна в pl/sql, является версия 'df', которая позволяла генераторам таблиц SQL выбирать табличное пространство с наибольшим количеством свободного пространства, доступного во время выполнения.
Я использовал plperlu, и это было относительно просто, хотя я должен был быть осторожен с типизацией данных.