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