Es ist eine ziemlich etablierte Konvention, dass Namen von Datenbanktabellen, zumindest in SQL, Singular sein sollten. SELECT * FROM user;
Siehe diese Frage und Diskussion .
Es ist auch eine ziemlich etablierte Konvention, dass RESTful API-Ressourcennamen im Plural sein sollten. GET /users/123
und POST /users
sieh dir das an .
In der einfachsten datenbankgestützten API ist der Name der Ressource in der URL die Tabelle, und die Datenelemente in der URL und den Anforderungs- / Antwortkörpern werden direkt den Spalten in der Datenbank zugeordnet. Konzeptionell sehe ich keinen Unterschied zwischen der Arbeit mit den Daten über diese theoretische API und der Arbeit direkt über SQL. Und deswegen macht der Unterschied in den Namenskonventionen zwischen user
und für users
mich keinen Sinn.
Wie kann der Unterschied in der Pluralisierung gerechtfertigt werden, wenn REST-API und SQL konzeptionell dasselbe tun?
quelle
Antworten:
Die REST-Spezifikation (unabhängig von der gewünschten Ebene) wurde nicht als Datenbankzugriff konzipiert. Es wird versucht, den API-Zugriff zu standardisieren. Die genannten SQL-Konventionen (ob Sie sie verwenden möchten oder nicht) wurden nicht für den API-Zugriff entwickelt. Sie dienen zum Schreiben von SQL-Abfragen.
Das Problem beim Entpacken ist daher das konzeptionelle Verständnis, dass eine API direkt der Datenbank zugeordnet wird. Wir können dies zumindest bis ins Jahr 2009 als Anti-Pattern bezeichnen .
Der Hauptgrund dafür ist schlecht? Der Code mit der Beschreibung "Wie wirkt sich dieser Vorgang auf meine Daten aus?" wird Client-Code .
Dies hat einige schreckliche Auswirkungen auf die API. (keine vollständige Liste)
Dies erschwert die Integration in die API
Ich stelle mir die Schritte zum Erstellen eines neuen Benutzers folgendermaßen vor:
POST /users { .. }
POST /usersettings { .. }
mit einigen StandardwertenPOST /confirmemails { .. }
Aber wie gehen Sie mit einem Fehler in Schritt 2 um? Wie oft wird dieselbe Logik für andere Clients Ihrer API kopiert?
Das Sichern der API wird zu einem schwarzen Loch der Verzweiflung
Angenommen, Sie müssen zwei Benutzerkonten zusammenführen.
GET /users/1
PUT /users/2 { .. }
DELETE /users/1
Wie richten Sie eine Benutzerberechtigung ein, um die Zusammenführungsfunktion zuzulassen, ohne das Löschen von Benutzern zuzulassen? Ist das Löschen eines Benutzers überhaupt angemessen,
DELETE /users/1
wenn es/usersettings
auch existiert?Wartung wird schwieriger
... weil Ihre Kunden von Ihrer Datenbankstruktur abhängig sind.
Basierend auf meinen Erfahrungen mit diesem Szenario:
Wenn Sie also eine API nur als Schnittstelle direkt in eine Datenbank verwenden, ist die Pluralisierung die geringste Sorge. Abgesehen von einem Einwegexperiment würde ich vorschlagen, einige Zeit damit zu verbringen, die übergeordneten Operationen zu bestimmen, die die API darstellen soll. Und wenn Sie es so betrachten, gibt es keinen Konflikt zwischen pluralisierten API-Entitätsnamen und singulären SQL-Entitätsnamen. Sie sind aus verschiedenen Gründen da.
quelle
REST API und SQL machen NICHT "dasselbe"
Das OP fragt:
Ah, aber Heuschrecke, es mag so aussehen , als ob die RESTful-Schnittstelle und die SQL-Tabellen "dasselbe tun", aber eine gute Programmierhygiene sagt uns, dass es immer eine Zwischenschicht gibt, die zwischen der REST-API und der Datenbank vermittelt. Diesen Punkt zu ignorieren bedeutet, vom Weg zur Softwareaufklärung abzuweichen! :)
So können RESTful-APIs und SQL-Tabellen problemlos ihren eigenen idiomatischen Namenskonventionen folgen, die an anderer Stelle gut dokumentiert und ausführlich besprochen werden.
quelle