Я уверен, что я не единственный, кто расстраивается, когда видит страницу кода, заваленную SQL-запросами. ActiveRecord и другие шаблоны ORM помогают уменьшить объем SQL, используемый в проекте, но во многих случаях сложных запросов использование SQL, по-видимому, неизбежно.
Я ищу мнения о том, как SQL-запросы должны быть организованы с остальной частью кода (или за его пределами), чтобы предотвратить его разброс по всему? Одна очевидная идея - использование представлений, но часто представления могут быть источником проблем с производительностью при работе с несколькими большими индексированными таблицами и т. Д.
РЕДАКТИРОВАТЬ 1 - Я предполагаю, что вы уже разделили его на слой модели
sql
code-formatting
jellyfishtree
источник
источник
Ответы:
Для меня SQL является фундаментальной частью (во многих случаях, большинством) кода бизнес-логики. Если вы попытаетесь отделить его от кода, который работает с возвращенными данными, вы более склонны разбалансировать понятность и удобство сопровождения кода.
Когда я смотрю на это, чтение данных, обработка данных, запись данных, поиск данных ... все они являются похожими операциями и лучше всего хранятся в одном месте.
Если вы начинаете ощущать дублирование усилий с запросами, то, возможно, вам нужно представление базы данных или объект, который может инкапсулировать этот аспект доступа к базе данных.
Другой совет, чтобы действительно иметь хороший метод запроса к базе данных. В программном обеспечении, которое я пишу (PostgreSQL, MySQL, SQL Server), я гарантировал, что большая часть моих операций с запросами может выполняться как единое выражение кода.
Это (примерно) основные вызовы функций, которые я гарантирую, являются частью моего "объекта соединения". Это зависит от языка, от того, что вы на самом деле реализуете, но моя цель - сделать его действительно очень простым и безболезненным.
Таким образом, рассматривайте SQL как неотъемлемую часть программирования и не абстрагируйтесь ради абстракции.
источник
Как правило, лучше всего иметь отдельный слой модели. Существует ряд шаблонов корпоративного дизайна, которые позволяют спроектировать это.
источник
Было бы неплохо разделить слой модели на 3 подуровня: «сущности», «репозитории» и «сервисы». Это позволит вам разделить проблемы и собрать SQL в одном месте из вашей бизнес-логики.
В этом случае весь код извлечения данных, включая сложный SQL, будет расположен в репозиториях. Таким образом, цель репозитория - скрыть сложные операторы SQL за такими понятными методами, как
getUsersWithActiveSubscription()
.Сущность абстрагирует реальные имена полей таблицы БД с помощью методов получения и установки, может обеспечить некоторую конвертацию данных между типами полей БД и типами, доступными в вашем приложении / языке программирования. Если ваш ORM поддерживает это - сущности могут обрабатывать ассоциации.
Сервисный уровень - это место для бизнес-логики. Сервис извлекает сущности с помощью репозиториев, воздействует на них и сохраняет их обратно.
источник