Ответ
Есть несколько основных подходов:
- ORM (Object-Relational Mapping) - преобразует таблицы БД в объекты. Пример с Sequelize (Node.js):
const User = sequelize.define('User', {
name: DataTypes.STRING,
age: DataTypes.INTEGER
});
await User.findAll();
- Query Builders - построение SQL запросов через цепочки методов:
knex('users').where('age', '>', 18).select('name');
- Raw SQL - прямое выполнение SQL запросов:
pool.query('SELECT * FROM users WHERE age > $1', [18]);
-
Data Mapper - отделяет бизнес-логику от слоя доступа к данным (более сложный чем ORM)
-
Active Record - модель содержит и данные, и методы работы с БД (как в Ruby on Rails)
Для фронтенда обычно используют ORM или Query Builders для удобства, либо GraphQL/REST API для работы через бэкенд.
Ответ 18+ 🔞
А, ну ты про то, как с базой данных разговаривать, да? Ну, тут, блядь, вариантов — как собак нерезаных, на самом деле. Смотри, я тебе по полочкам разложу, а то ты, наверное, сейчас в глазах квадраты от этих терминов видишь.
1. ORM (Это когда таблицы в объекты превращают) Ну, это как переводчик с языка таблиц на язык твоего кода. Взял строку из базы — получил объект, с которым можно работать. Удобно, но иногда этот переводчик такой заумный, что сам чёрт ногу сломит. Вот смотри, как в Sequelize это выглядит, простейший пример:
const User = sequelize.define('User', {
name: DataTypes.STRING,
age: DataTypes.INTEGER
});
await User.findAll();
Видишь? Объявил, что есть сущность «Юзер», и потом просто у неё методы вызываешь. Красота. Пока она не начнёт тебе SQL-запросы в три экрана генерить, от которых сервер плачет. Но это уже детали, епта.
2. Query Builders (Строители запросов) А это, блядь, как конструктор «Лего» для SQL. Ты не пишешь запрос руками, а собираешь его из кубиков-методов. Меньше шансов опечататься, и можно динамически собирать.
knex('users').where('age', '>', 18).select('name');
Типа: «Эй, Кнекс, дай-ка мне из users тех, кому за 18, и только имена». Всё чётко, понятно, и SQL сам соберётся. Хуй с горы, если честно, очень удобная штука.
3. Raw SQL (Голый SQL, без посредников) А вот это, сука, для настоящих пацанов. Или для тех, кому ORM нагенерировал такую дичь, что проще самому. Берёшь и пишешь запрос как есть, напрямую.
pool.query('SELECT * FROM users WHERE age > $1', [18]);
Всё. Никакой магии. Ты сам контролируешь каждую запятую. Мощно, эффективно, но, блядь, если запрос сложный, можно так запутаться, что сам от себя охуеешь. И с безопасностью надо голову включать, а то SQL-инъекции тебя сожрут.
4. Data Mapper и 5. Active Record Ну, это уже, извини, более высокие материи. Data Mapper — это когда у тебя бизнес-логика и работа с базой живут в разных комнатах и не пересекаются. Сложно, зато гибко. Active Record — это когда твоя модель сама умеет себя сохранять и грузить, как в том самом Ruby on Rails. Удобно для стандартных задач, но если задача нестандартная — начинается пиздец и боль.
А что для фронтенда? Слушай, фронтенд, он же обычно с базой напрямую не общается, это ж опасно, как хуй в пальто на минном поле. Обычно там либо ORM/Query Builder на бэкенде, который тебе через REST или GraphQL API данные отдаёт аккуратненько упакованными. Либо, если уж совсем modern stack, то какая-нибудь клиентская библиотека для того же GraphQL, которая тебе запросы формирует.
Короче, выбор зависит от того, насколько ты готов страдать. Хочешь быстро и просто — бери ORM. Хочешь контроль — Query Builder или Raw SQL. А хочешь архитектурной чистоты и головной боли на три года вперёд — welcome в мир паттернов типа Data Mapper. Решай сам, я лишь варианты озвучил.