Задать вопрос
junk1114
@junk1114
Web-программист

Как разделять логику запросов в СУБД и PHP?

Раньше, когда были небольшие проекты и не было времени уделять должное время изучению MySQL, я делал простой или пару-тройку простых запрос в MySQL, затем уже обрабатывал результат в PHP, возможно в цикле делая еще пару запросов. Естественно это неправильно. Начал изучать плотнее СУБД. В новых версиях очень много возможностей, включая условия и прочее.
Так вот, как не перегрузить логику запроса к БД? Как правильно разделить работу СУБД и PHP?
  • Вопрос задан
  • 676 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
Как правильно разделить работу СУБД и PHP?

Есть очень простой принцип.

СУБД - это подсистема, которая хранит и извлекает данные, а приложение (на PHP или на чем угодно) - их обрабатывает и модиифицирует, если нужно.
СУБД архитектурно (и физически) "ближе" к данным. Одна из важнейших задач СУБД - выбрать из всего объема БД только нужные сейчас данные. Именно на уровне СУБД нужно производить максимум фильтраций. У нее есть все нужное для этого - индексы и прочие хитрые структуры данных.

Однако, чтобы СУБД лучше выполняла свои основные задачи, не стоит нагружать ее лишней вычислительной работой. Все, что не связано с поддержанием целостности и согласованности данных, отдают на уровень приложения - тогда эти вычисления (куда относятся, к примеру, подготовка JSON-ответов или сборка web-страницы по шаблону) можно выполнить логически и физически на других узлах, что влечет за собой очевидные преимущества.

Поэтому вывод такой: выбирайте как можно меньше записей и столбцов/атрибутов в запросе к БД (т.е., например, никаких * в плановых запросах), и делайте как можно больше работы с ними на уровне приложения (настолько, насколько удается соблюдать требуемые гарантии целостности).
Под "как можно меньше записей" я имею в виду делать запрос максимально конкретным и узконаправленным, но достаточным для выполнения текущей задачи.
Ответ написан
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
я бы все-же постарался максимально процесс выборки данных отдать в СУБД. Такой вариант однозначно быстрее и надежнее.
Ответ написан
Комментировать
@kshvakov
У всех разное понимание "правильно". По сути все сводится к "либо все, либо ничего".
Если есть понимание как работает СУБД и её возможностей, вы скорее всего будете все выносить в нее: приложение будет туда только "ходить за данными" (дергать одну "хранимку" всесто кучи запросов), и записывать данные, опять же через "хранимку" и одним запросом вместо кучи. У нас даже "шедулеры" в самой БД (если они должны менять данные или что-то с ними делать).

Либо вариант когда СУБД выступает как хранилище строк с продвинутыми возможностями типа вторичных ключей и индексов + более развесистый синтаксис на "селект", такое обычно с MySql в виду его "особенностей"
Ответ написан
Комментировать
@djay
В дополнение к тому что сказал Вячеслав:

1. Если вычисления проводятся на уровне БД, то это вносит дополнительные затраты по времени и сложности при разработке юнит-тестов.

2. Теоритически - также проблематично будет мигрировать на другую БД, скажем на MongoDB, к примеру. Ведь подсчёты жетско прописаны в определенном движке. А так придётся дублировать логику подсчетов в новом движке, что весьма не правильно.

3. Есть такой принцип - называется SoC. Так вот, он гласит что ответсвенности должны разделяться. Бизнес логика и вычесления - это одна ответсвенность, а хранение данных - это другая.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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