A especificação REST (qualquer que seja o nível que você queira ir) não foi projetada como acesso ao banco de dados. Ele está tentando trazer padronização para o acesso à API. As convenções SQL mencionadas (se você deseja usá-las ou não) não foram projetadas com o acesso à API em mente. Eles são para escrever consultas SQL.
Portanto, o problema a ser descompactado aqui é o entendimento conceitual de que uma API mapeia diretamente para o banco de dados. Podemos encontrar isso descrito como um anti-padrão pelo menos desde 2009 .
A principal razão pela qual isso é ruim? O código que descreve "como essa operação afeta meus dados?" torna-se código de cliente .
Isso tem alguns efeitos terríveis na API. (não é uma lista exaustiva)
Torna difícil a integração com a API
Eu imagino as etapas para criar um novo usuário documentado da seguinte forma:
POST /users { .. }
POST /usersettings { .. }
com alguns valores padrão
POST /confirmemails { .. }
Mas como você lida com uma falha da etapa 2? Quantas vezes essa mesma lógica de manipulação é copiada em massa para outros clientes da sua API?
Essas operações de dados geralmente são mais fáceis de sequenciar no lado do servidor, enquanto são iniciadas no cliente como uma única operação. Por exemplo POST /newusersetup
. Os DBAs podem reconhecer isso como um procedimento armazenado, mas a operação da API pode ter efeitos além do banco de dados.
Proteger a API se torna um buraco negro de desespero
Digamos que você precise mesclar duas contas de usuário.
GET /users/1
PUT /users/2 { .. }
DELETE /users/1
Como você irá configurar uma permissão de usuário para permitir o recurso de mesclagem sem permitir a exclusão do usuário? A exclusão de um usuário é representada de maneira justa por DELETE /users/1
quando /usersettings
também existe?
As operações da API devem ser encaradas como operações de nível superior (que não o banco de dados), que podem causar várias alterações no sistema.
Manutenção fica mais difícil
... porque seus clientes dependem da sua estrutura de banco de dados.
Com base na minha experiência com este cenário:
- Você não pode renomear ou remover tabelas / colunas existentes. Mesmo quando eles são nomeados incorretamente por sua função ou não são mais usados. Clientes vão quebrar.
- Os novos recursos não podem alterar as estruturas de dados existentes; portanto, seus dados e funcionalidade geralmente são separados artificialmente, mesmo quando pertencem holisticamente a um recurso existente.
- A base de código gradualmente se torna mais difícil de entender devido à fragmentação, nomes confusos e bagagem restante que não pode ser removida com segurança.
- Todas, exceto as triviais, tornam-se cada vez mais arriscadas e demoradas.
- O sistema estagna e é substituído.
Não exponha sua estrutura de banco de dados diretamente a clientes ... especialmente clientes sobre os quais você não tem controle de desenvolvimento. Use uma API para restringir o cliente a apenas operações válidas.
Portanto, se você estiver usando uma API apenas como uma interface direta em um banco de dados, a pluralização é a menor das suas preocupações. Para outras experiências que não sejam descartáveis, sugiro que dedique algum tempo a determinar as operações de nível superior que a API deve representar. E quando você olha dessa maneira, não há conflito entre nomes de entidades da API pluralizados e nomes de entidades SQL singulares. Eles estão lá por diferentes razões.