MySQL Stored Procedure по сравнению со Сценарием PHP

Проблема

У вас есть определение функции с полным кодом в заголовке, который вы включаете в несколько модулей компиляции. Это приводит к тому, что функция определяется в каждом модуле компиляции (cpp), и это нарушает Правило единого определения (ODR) .

Включающие охранники следят за тем, чтобы одно и то же определение не встречалось несколько раз в одном и том же модуле компиляции (например, если вы включили function.hpp в neuron.hpp и также включили его напрямую). Но здесь этот заголовок прямо или косвенно включен в main.cpp, ffnet.cpp и neuron.cpp, что дает первое определение и 2 недопустимых переопределения.

Решение

Необходимо изменить function.hpp, чтобы оставить только объявление функции:

#ifndef FUNCTIONS_HPP
#define FUNCTIONS_HPP
double random_double();  // no body !!
#endif

и переместить тела функций в отдельный function.cpp, который должен быть добавленным к вашей команде компилятора.

Преимущество этого подхода:

  • Затем можно скомпилировать функции полезности отдельно. Каждый раз, когда вы меняете тело функции, вам больше не нужно перекомпилировать весь cpp.
  • Инкапсуляция улучшена за счет совместного использования в hpp только того, что нужно знать другим модулям, и сокрытия деталей реализации.
  • Повторное использование может быть облегчено во всех проектах путем создания библиотеки функций.
  • Включения будут короче (в случае, если в некотором отдаленном будущем ваш код превратится в большой проект с тысячами hpp, это может заставить вас выиграть некоторое время)

Дополнительные замечания

Не уверен, что это применимо, но имейте в виду, что не стоит включать заголовок в пространство имен.

Я также рекомендую прочитать эту статью о заголовках . Это старый, но совет все еще очень актуален: -)

Обратите внимание, что существуют исключения из ODR для классов и встроенных функций, и в этом случае множественные определения должны быть точно такой же последовательностью токенов.

8
задан ticallian 1 May 2009 в 07:45
поделиться

4 ответа

Вот эталонный тест с хранимой процедурой по сравнению с php.

http://mtocker.livejournal.com/45222.html

Хранимая процедура была медленнее в 10 раз.

Вы может также захотеть посмотреть на это:

http://www.tonymarston.net/php-mysql/stored-procedures-are-evil.html

14
ответ дан 5 December 2019 в 05:46
поделиться

Если причина, по которой вы думаете об этом, связана с производительностью и масштабируемостью, то я бы порекомендовал продолжить вычисления в PHP.

Причина этого заключается в том, что независимо от того, есть ли снижение производительности в вашем PHP, когда когда вы масштабируете свое веб-приложение, обычно гораздо проще перейти на несколько веб-серверов, чем на несколько серверов баз данных. Поэтому предпочтительно делать больше вычислений в PHP и меньше в MySQL.

Кроме аспекта производительности, Я все же обычно предпочитаю избегать хранимых процедур в пользу наличия логики в приложении, потому что она может быть менее переносимой. Хранимая процедура добавляет усилий, необходимых для развертывания нового экземпляра вашего приложения.

  • Они написаны на другом языке, нежели PHP, поэтому разработчик PHP может не найти их простыми для понимания.
  • Может быть трудно иметь они хранятся в системе контроля версий.
  • Конечно, все эти проблемы можно решить без особых сложностей, если вы хотите использовать хранимые процедуры.

    8
    ответ дан 5 December 2019 в 05:46
    поделиться

    Короче, держите их в php. Проще поддерживать.

    Для текущего сайта вряд ли когда-либо случится проблема с производительностью, когда разница между скоростью calc в php и скоростью calc в базе данных когда-либо заметна. Если бы вы были, значит, что-то в корне не так с кодом сайта. (Это включает в себя конвертацию валюты в реальном времени, если это будет сделано.)

    Говоря, что хранение калькуляции в PHP обычно предпочтительнее, так как ее легче контролировать и отлаживать. Это требует, чтобы веб-кодеры немного знали базу данных, но обычно это не проблема. 90% ускорений кода происходит на 10% кода, и для dba было бы достаточно легко идентифицировать запросы, вызывающие загрузку db, если это когда-либо произойдет.

    3
    ответ дан 5 December 2019 в 05:46
    поделиться

    Если это абсолютно необходимо обновлять цены при каждом запросе страницы, и вы беспокоитесь, что на сайт будет приходить много трафика, я бы не рекомендовал хранимые процедуры.

    Я бы рекомендовал кэшировать информацию, которую вы используете (и это сложно не вдаваясь в подробности, не зная, как вы это делаете) в памяти (возможно, с использованием memcached) и продолжайте читать ее из PHP.

    Я признаю, что я не делал никаких сравнений между хранимыми процедурами и производительностью PHP в памяти, но если процедура неt напрямую влияет на ваш запрос, я рекомендую кэшировать.

    4
    ответ дан 5 December 2019 в 05:46
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: