Le specifiche REST (qualunque sia il livello che si desidera raggiungere) non sono state progettate come accesso al database. Sta cercando di portare la standardizzazione all'accesso alle API. Le convenzioni SQL menzionate (che tu voglia usarle o meno) non sono state progettate pensando all'accesso alle API. Sono per la scrittura di query SQL.
Quindi il problema da decomprimere qui è la comprensione concettuale che un'API esegue il mapping direttamente al database. Possiamo trovarlo descritto come un anti-pattern almeno fino al 2009 .
Il motivo principale è negativo? Il codice che descrive "in che modo questa operazione influisce sui miei dati?" diventa codice cliente .
Ciò ha effetti piuttosto terribili sull'API. (non un elenco esaustivo)
Rende difficile l'integrazione con l'API
Immagino i passaggi per creare un nuovo utente documentato come qualcosa del genere:
POST /users { .. }
POST /usersettings { .. }
con alcuni valori predefiniti
POST /confirmemails { .. }
Ma come gestite un fallimento del passaggio 2? Quante volte questa stessa logica di gestione viene copiata e incollata ad altri client della tua API?
Queste operazioni sui dati sono spesso più facili da eseguire in sequenza sul lato server, mentre vengono avviate dal client come un'unica operazione. Es POST /newusersetup
. I DBA possono riconoscere questo come una procedura memorizzata, ma l'operazione API può avere effetti oltre il solo database.
Proteggere l'API diventa un buco nero di disperazione
Supponiamo che tu debba unire due account utente.
GET /users/1
PUT /users/2 { .. }
DELETE /users/1
Come hai intenzione di impostare un'autorizzazione utente per consentire la funzionalità di unione senza consentire l'eliminazione dell'utente? L'eliminazione di un utente è persino rappresentata in modo equo da DELETE /users/1
quando /usersettings
esiste?
Le operazioni API devono essere considerate operazioni di livello superiore (rispetto al database) che possono causare più modifiche nel sistema.
La manutenzione diventa più difficile
... perché i tuoi clienti dipendono dalla struttura del tuo database.
Sulla base della mia esperienza con questo scenario:
- Non è possibile rinominare o rimuovere tabelle / colonne esistenti. Anche quando vengono denominati in modo errato per la loro funzione o non vengono più utilizzati. I clienti si romperanno.
- Le nuove funzionalità non possono modificare le strutture dati esistenti, quindi i suoi dati e funzionalità sono spesso separati artificialmente anche quando appartengono olisticamente a una funzionalità esistente.
- La base di codice diventa gradualmente più difficile da comprendere a causa della frammentazione, dei nomi confusi e del bagaglio rimasto che non può essere rimosso in sicurezza.
- Tutti i cambiamenti, tranne quelli banali, diventano sempre più rischiosi e richiedono molto tempo.
- Il sistema ristagna e alla fine viene sostituito.
Non esporre la struttura del database direttamente ai client ... in particolare i client su cui non si ha il controllo dello sviluppo. Utilizzare un'API per restringere il client a sole operazioni valide.
Quindi, se stai usando un'API come semplice interfaccia direttamente in un database, la pluralizzazione è l'ultima delle tue preoccupazioni. Per un esperimento a parte, suggerirei di dedicare un po 'di tempo a determinare le operazioni di livello superiore che l'API dovrebbe rappresentare. E quando lo guardi in questo modo, non c'è conflitto tra nomi di entità API pluralizzati e nomi di entità SQL singolari. Sono lì per diversi motivi.