É uma convenção bastante estabelecida que nomes de tabelas de banco de dados, pelo menos em SQL, devem ser singulares. SELECT * FROM user;
Veja esta pergunta e discussão .
Também é uma convenção bastante estabelecida que os nomes de recursos da API RESTful devem ser plurais. GET /users/123
e POST /users
veja este .
Na API mais simples suportada pelo banco de dados, o nome do recurso na URL seria a tabela, e os elementos de dados na URL e nos corpos de solicitação / resposta seriam mapeados diretamente para as colunas no banco de dados. Conceitualmente, não vejo diferença entre operar nos dados através desta API teórica e operar diretamente através do SQL. E por isso, a diferença nas convenções de nomenclatura entre user
e users
não faz sentido para mim.
Como a diferença de pluralização pode ser justificada quando, conceitualmente, a API REST e o SQL estão fazendo a mesma coisa?
fonte
Respostas:
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ãoPOST /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?
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?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:
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.
fonte
A API REST e o SQL NÃO estão "fazendo a mesma coisa"
O PO pergunta:
Ah, mas gafanhoto, pode parecer que a interface RESTful e as tabelas SQL "estão fazendo a mesma coisa", mas uma boa higiene de programação nos diz que sempre há uma camada intermediária que medeia entre a API REST e o banco de dados. Ignorar esse ponto é desviar-se do caminho para a iluminação do software! :)
Portanto, as APIs RESTful e as tabelas SQL podem seguir alegremente suas próprias convenções de nomenclatura idiomática, que são bem documentadas e discutidas em outros lugares.
fonte