Es una convención bastante establecida que los nombres de tablas de bases de datos, al menos en SQL, deben ser singulares. SELECT * FROM user;
Vea esta pregunta y discusión .
También es una convención bastante establecida que los nombres de recursos RESTful API deben ser plurales. GET /users/123
yPOST /users
mira este .
En la API respaldada por base de datos más simple, el nombre del recurso en la URL sería la tabla, y los elementos de datos en la URL y los cuerpos de solicitud / respuesta se asignarían directamente a las columnas en la base de datos. Conceptualmente, no veo una diferencia entre operar en los datos a través de esta API teórica versus operar en ella directamente a través de SQL. Y debido a eso, la diferencia en las convenciones de nombres entre user
y users
no tiene sentido para mí.
¿Cómo puede justificarse la diferencia en la pluralización cuando, conceptualmente, la API REST y el SQL están haciendo lo mismo?
fuente
Respuestas:
La especificación REST (cualquier nivel con el que desee ir) no se diseñó como acceso a la base de datos. Está tratando de llevar la estandarización al acceso a la API. Las convenciones de SQL mencionadas (si desea usarlas o no) no se diseñaron teniendo en cuenta el acceso a la API. Son para escribir consultas SQL.
Entonces, el problema para desempaquetar aquí es la comprensión conceptual de que una API se asigna directamente a la base de datos. Podemos encontrar esto descrito como un antipatrón al menos desde 2009 .
¿La razón principal por la que esto es malo? El código que describe "¿cómo afecta esta operación a mis datos?" se convierte en código de cliente .
Esto tiene algunos efectos terribles en la API. (no es una lista exhaustiva)
Hace que la integración con la API sea difícil
Me imagino los pasos para crear un nuevo usuario documentado como algo así:
POST /users { .. }
POST /usersettings { .. }
con algunos valores predeterminadosPOST /confirmemails { .. }
Pero, ¿cómo manejas una falla del paso 2? ¿Cuántas veces es esta misma lógica de manejo copiada a otros clientes de su API?
Asegurar la API se convierte en un agujero negro de desesperación
Digamos que necesita fusionar dos cuentas de usuario.
GET /users/1
PUT /users/2 { .. }
DELETE /users/1
¿Cómo va a configurar un permiso de usuario para permitir la función de combinación sin permitir la eliminación del usuario? ¿La eliminación de un usuario está incluso representada de manera justa
DELETE /users/1
cuando/usersettings
también existe?El mantenimiento se vuelve más difícil
... porque sus clientes dependen de la estructura de su base de datos.
Según mi experiencia con este escenario:
Entonces, si está utilizando una API como solo una interfaz directamente en una base de datos, la pluralización es la menor de sus preocupaciones. Para otro experimento que no sea tirar, sugeriría pasar un tiempo determinando las operaciones de nivel superior que la API debería representar. Y cuando lo miras de esa manera, no hay conflicto entre los nombres de entidades API pluralizadas y los nombres de entidades SQL singulares. Están allí por diferentes razones.
fuente
REST API y SQL NO están "haciendo lo mismo"
El OP pregunta:
Ah, pero saltamontes, puede parecer que la interfaz RESTful y las tablas SQL "están haciendo lo mismo", pero una buena higiene de la programación nos dice que siempre hay una capa intermedia que media entre la API REST y la base de datos. ¡Ignorar este punto es desviarse del camino hacia la iluminación del software! :)
Por lo tanto, las API RESTful y las tablas SQL pueden seguir felizmente sus propias convenciones de nomenclatura idiomáticas, que están bien documentadas y discutidas a fondo en otros lugares.
fuente