Спецификация REST (с каким бы уровнем вы не хотели идти) не была предназначена для доступа к базе данных. Он пытается привнести стандартизацию в доступ к API. Упомянутые соглашения SQL (хотите ли вы их использовать или нет) не были разработаны с учетом доступа к API. Они для написания запросов SQL.
Таким образом, проблема, которую нужно распаковать, заключается в концептуальном понимании того, что API-интерфейс отображается непосредственно в базу данных. Мы можем найти это как анти-паттерн, по крайней мере, еще в 2009 году .
Основная причина, это плохо? Код, описывающий "как эта операция влияет на мои данные?" становится клиентским кодом .
Это имеет довольно ужасные последствия для API. (не исчерпывающий список)
Это затрудняет интеграцию с API
Я представляю шаги для создания нового пользователя, задокументированного примерно так:
POST /users { .. }
POST /usersettings { .. }
с некоторыми значениями по умолчанию
POST /confirmemails { .. }
Но как вы справляетесь с провалом шага № 2? Сколько раз эта же логика обработки копируется в другие клиенты вашего API?
Эти операции с данными часто проще упорядочить на стороне сервера, при этом они инициируются клиентом как одна операция. Например POST /newusersetup
. Администраторы БД могут распознать это как хранимую процедуру, но операция API может иметь последствия не только для базы данных.
Защита API становится черной дырой отчаяния
Допустим, вам нужно объединить две учетные записи пользователей.
GET /users/1
PUT /users/2 { .. }
DELETE /users/1
Как вы собираетесь настроить разрешение пользователя, чтобы разрешить функцию слияния, не разрешая удаление пользователя? Является ли удаление пользователя даже справедливо представленным, DELETE /users/1
когда /usersettings
также существует?
Операции API следует рассматривать как операции более высокого уровня (чем база данных), которые могут вызвать многочисленные изменения в системе.
Обслуживание становится сложнее
... потому что ваши клиенты зависят от вашей структуры базы данных.
Основываясь на моем опыте с этим сценарием:
- Вы не можете переименовать или удалить существующие таблицы / столбцы. Даже когда они названы неправильно для их функции или больше не используются. Клиенты сломаются.
- Новые функции не могут изменить существующие структуры данных, поэтому их данные и функциональные возможности часто искусственно разделяются, даже если они целостно связаны с существующей функцией.
- Кодовая база постепенно становится все труднее понять из-за фрагментации, запутанных имен и остатков багажа, которые невозможно безопасно удалить.
- Все, кроме тривиальных изменений, становятся все более рискованными и трудоемкими.
- Система застаивается и в итоге заменяется.
Не раскрывайте свою структуру базы данных непосредственно клиентам ... особенно клиентам, над которыми у вас нет контроля над развитием. Используйте API, чтобы сузить клиента до только допустимых операций.
Так что, если вы используете API-интерфейс как интерфейс непосредственно в базе данных, плюрализация - это наименьшее количество ваших забот. Для других экспериментов я бы предложил потратить некоторое время на определение операций более высокого уровня, которые должен представлять API. И если взглянуть на это с такой точки зрения, то между множественными именами объектов API и именами отдельных объектов SQL нет конфликта. Они там по разным причинам.