Ini adalah konvensi yang cukup mapan bahwa nama tabel database, setidaknya dalam SQL, harus tunggal. SELECT * FROM user;
Lihat pertanyaan dan diskusi ini .
Ini juga merupakan konvensi yang cukup mapan bahwa nama sumber daya RESTful API harus jamak. GET /users/123
dan POST /users
Lihat yang ini .
Dalam API yang didukung database paling sederhana, nama sumber daya di URL akan menjadi tabel, dan elemen data dalam URL dan badan permintaan / respons akan memetakan langsung ke kolom di DB. Secara konseptual, saya tidak melihat perbedaan antara beroperasi pada data melalui API teoretis ini dibandingkan beroperasi secara langsung melalui SQL. Dan karena itu, perbedaan dalam konvensi penamaan antara user
dan users
tidak masuk akal bagi saya.
Bagaimana perbedaan dalam pluralisasi dibenarkan ketika, secara konseptual, REST API dan SQL melakukan hal yang sama?
sumber
Jawaban:
Spesifikasi REST (level apa pun yang ingin Anda tuju) tidak dirancang sebagai akses basis data. Ia mencoba membawa standardisasi ke akses API. Konvensi SQL yang disebutkan (apakah Anda ingin menggunakannya atau tidak) tidak dirancang dengan mempertimbangkan akses API. Mereka untuk menulis kueri SQL.
Jadi masalah yang harus dibongkar di sini adalah pemahaman konseptual bahwa API memetakan langsung ke database. Kita dapat menemukan ini digambarkan sebagai anti-pola setidaknya sejak 2009 .
Alasan utama ini buruk? Kode yang menjelaskan "bagaimana operasi ini mempengaruhi data saya?" menjadi kode klien .
Ini memiliki beberapa efek yang sangat buruk pada API. (bukan daftar lengkap)
Itu membuat pengintegrasian dengan API sulit
Saya membayangkan langkah-langkah untuk membuat pengguna baru yang didokumentasikan sebagai sesuatu seperti ini:
POST /users { .. }
POST /usersettings { .. }
dengan beberapa nilai defaultPOST /confirmemails { .. }
Tetapi bagaimana Anda menangani kegagalan langkah # 2? Berapa kali logika penanganan yang sama ini disalin-tempel ke klien lain dari API Anda?
Mengamankan API menjadi lubang hitam keputusasaan
Katakanlah Anda perlu menggabungkan dua akun pengguna.
GET /users/1
PUT /users/2 { .. }
DELETE /users/1
Bagaimana Anda akan mengatur izin pengguna untuk mengizinkan fitur penggabungan sementara tidak mengizinkan penghapusan pengguna? Apakah menghapus pengguna bahkan diwakili dengan adil
DELETE /users/1
ketika/usersettings
juga ada?Perawatan menjadi lebih sulit
... karena klien Anda bergantung pada struktur basis data Anda.
Berdasarkan pengalaman saya dengan skenario ini:
Jadi, jika Anda menggunakan API hanya sebagai antarmuka langsung ke database, pluralisasi adalah yang paling tidak Anda khawatirkan. Untuk selain percobaan membuang-buang, saya akan menyarankan menghabiskan waktu menentukan operasi tingkat tinggi yang harus diwakili oleh API. Dan ketika Anda melihatnya dengan cara itu, tidak ada konflik antara nama entitas API yang jamak dan nama entitas SQL tunggal. Mereka ada di sana karena berbagai alasan.
sumber
REST API dan SQL TIDAK "melakukan hal yang sama"
OP bertanya:
Ah, tapi belalang, mungkin tampak bahwa antarmuka RESTful dan tabel SQL "melakukan hal yang sama", tetapi kebersihan pemrograman yang baik memberi tahu kita bahwa selalu ada lapisan perantara yang memediasi antara API REST dan basis data. Mengabaikan hal ini berarti menyimpang dari jalan menuju pencerahan perangkat lunak! :)
Jadi RESTful APIs dan SQL tables dengan senang hati dapat mengikuti konvensi penamaan idiomatik mereka sendiri, yang didokumentasikan dengan baik dan didiskusikan secara menyeluruh di tempat lain.
sumber