Обращение к записи БД требует некоторой обработки. Что лучше: обработать в скрипте, который обратился, или в хранимой процедуре в БД?
Вкратце, вопрос о том, что эффективнее: хранить в записи список id объектов, которые должны быть обработаны при обращении к этой записи, в виде строки (скрипт будет парсить строку и отрабатывать каждый id), либо сделать триггер и хранимую процедуру (MySQL), которая возьмёт эту работу на себя?
Детали такие. Скрипт на Python для выделенного сервера + БД на MySQL. Скрипт получает запрос на обработку записи из основной таблицы. Обработка включает в себя инкрементирование ряда переменных пользователя, обратившегося к записи. Есть таблица, где для каждой переменной задано пороговое значение и действие, которое выполняется при достижении порога. Каждая запись влияет только на некоторые переменные (немного). Айдишники переменных, которые подлежат инкрементированию, можно хранить в одной строке в самой записи, а можно в отдельной таблице, но это накладнее. Вопрос: с точки зрения быстродействия отрабатывать эти переменные (инкремент, проверка порога, при достижении – формирование заявки на действие) в принимающем скрипте на Python или в хранимой процедуре на триггере силами СУБД? (Сопутствующая проблема: сможет ли хранимая процедура распарсить строку на айдишники, и если нет, то придётся хранить всё это в ещё одной таблице <запись_id-переменная_id>?)
Самый ужас здесь, конечно, это "а можно в отдельной таблице, но это накладнее".
Удивительно экономный народ - эти программисты.
Нижнее бельё они носят, хотя это очевидно "накладнее", чем без трусов ходить.
А вот о бедной базочке данных прям заботятся, как бы ей "накладнее" не вышло.
Прежде чем всё это усложнять описанным вами способом, необходимо определиться с ожидаемыми количествами. Насколько много всего будет переменных, насколько много может быть этих объектов, какие ожидаются частоты этих ваших обращений.
Ещё нужно определиться как вы планируете редактировать наборы изменяемых переменных. Запишете прямо в БД руками, или нужно делать API для редактирования списков?
Вы собираетесь скрипт запускать при каждом поступлении новой порции данных? Может правильнее запустить его на ожидание порций из пайпа? Или АПИ сделать поверх http.
По существу вопроса. Минус хранимых процедур в том, что это код, который хранится вместе с данными. Нужно делать отдельные специфические "приседания", чтобы правильно деплоить и обновлять такой код, хранить его в системе контроля версий, мигрировать от версии к версии...
Быстродействие в обоих случаях будет зависеть от конкретных действий, которые вы будете каждый раз повторять при "обращениях". Однако при наличии "бутылочного горлышка" в этом месте при реализации через хранимые процедуры вы уже мало что там можете сделать. А вот в коде на питоне можно при необходимости добавить воркеров и таски на длительные операции передавать им через очередь.
В целом задача звучит так, будто делать её надо максимально простым способом без предварительной оптимизации, которая, скорее всего, и не пригодится. Оптимизировать нужно по факту, когда понятно станет где будут проблемные места.