Perché la convenzione dice che i nomi delle tabelle DB dovrebbero essere singolari, ma le risorse RESTful plurali?

18

È una convenzione abbastanza consolidata che i nomi delle tabelle del database, almeno in SQL, dovrebbero essere singolari. SELECT * FROM user; Vedi questa domanda e discussione .

È anche una convenzione abbastanza consolidata che i nomi delle risorse API RESTful dovrebbero essere plurali. GET /users/123 e POST /users Vedi questo .

Nella più semplice API supportata da database, il nome della risorsa nell'URL sarebbe la tabella e gli elementi di dati nell'URL e gli organismi di richiesta / risposta verrebbero mappati direttamente alle colonne nel DB. Concettualmente, non vedo alcuna differenza tra il funzionamento dei dati attraverso questa API teorica e il fatto di operare direttamente su SQL. E a causa di ciò, la differenza nelle convenzioni di denominazione tra user e users non ha senso per me.

Come può la differenza nella pluralizzazione essere giustificata quando, concettualmente, l'API REST e l'SQL stanno facendo la stessa cosa?

    
posta smitelli 23.07.2015 - 22:17
fonte

2 risposte

12

La specifica REST (qualsiasi livello tu voglia andare) non è stata progettata come accesso al database. Sta cercando di portare la standardizzazione all'accesso API. Le convenzioni SQL menzionate (se si desidera utilizzarle o meno) non sono state progettate pensando all'API. Sono per la scrittura di query SQL.

Quindi il problema di decomprimere qui è la comprensione concettuale che un'API mappa direttamente nel database. Possiamo trovare questo descritto come un anti-modello almeno fino al 2009 .

La ragione principale è cattiva? Il codice che descrive "in che modo questa operazione influisce sui miei dati?" diventa codice cliente .

Questo ha degli effetti piuttosto terribili sull'API. (non un elenco completo)

Rende difficile l'integrazione con l'API

Immagino i passi per creare un nuovo utente documentato come qualcosa del tipo:

  1. POST /users { .. }
  2. POST /usersettings { .. } con alcuni valori predefiniti
  3. POST /confirmemails { .. }

Ma come gestisci un fallimento del passaggio n. 2? Quante volte la stessa logica di gestione copia-pasta su altri client della tua API?

These data operations are often easier to sequence on the server side, while being initiated from the client as a single operation. E.g. POST /newusersetup. DBAs may recognize this as a stored procedure, but the API operation may have effects beyond just the database.

La protezione dell'API diventa un buco nero di disperazione

Supponiamo di dover unire due account utente.

  1. GET /users/1
  2. PUT /users/2 { .. }
  3. DELETE /users/1

Come hai intenzione di impostare un'autorizzazione utente per consentire la funzione di unione pur non consentendo l'eliminazione dell'utente? Eliminare un utente rappresentato in modo equo anche da DELETE /users/1 quando esiste anche /usersettings ?

API operations should be looked at as higher-(than-database)-level operations which may cause multiple changes in the system.

La manutenzione diventa più difficile

... perché i tuoi client dipendono dalla struttura del tuo database.

In base alla 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 di dati esistenti, pertanto i dati e le funzionalità vengono spesso separate artificialmente anche quando appartengono olisticamente a una funzione esistente.
  • Il codice base diventa gradualmente più difficile da comprendere a causa della frammentazione, dei nomi confusi e del bagaglio residuo che non possono essere rimossi in modo sicuro.
  • Tutti i cambiamenti, tranne che banali, diventano sempre più rischiosi e richiedono molto tempo.
  • Il sistema ristagna e alla fine viene sostituito.

Don't expose your database structure directly to clients... especially clients you do not have developmental control over. Use an API to narrow the client down to just valid operations.

Quindi se stai usando un'API come un'interfaccia direttamente in un database, la pluralizzazione è l'ultima delle tue preoccupazioni. Per un esperimento diverso da quello a distanza, 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 plurali e nomi di entità SQL singolari. Sono lì per diversi motivi.

    
risposta data 01.02.2017 - 01:24
fonte
3

API REST e SQL NON "stanno facendo la stessa cosa"

L'OP chiede:

How can the difference in pluralization be justified when, conceptually, the REST API and the SQL are doing the same thing?

Ah, ma cavalletta, potrebbe apparire che l'interfaccia RESTful e le tabelle SQL "stanno facendo la stessa cosa", ma una buona igiene di programmazione ci dice che c'è sempre un livello intermedio che media tra API REST e database. Ignorare questo punto è allontanarsi dal sentiero verso l'illuminazione del software! :)

Quindi le API RESTful e le tabelle SQL possono seguire felicemente le proprie convenzioni di denominazione idiomatica, che sono ben documentate e discusse approfonditamente altrove.

    
risposta data 10.07.2018 - 19:45
fonte

Leggi altre domande sui tag