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 default
POST /confirmemails { .. }
Tetapi bagaimana Anda menangani kegagalan langkah # 2? Berapa kali logika penanganan yang sama ini disalin-tempel ke klien lain dari API Anda?
Operasi data ini sering lebih mudah untuk urutan di sisi server, sementara diprakarsai dari klien sebagai operasi tunggal. Misalnya POST /newusersetup
. DBA mungkin mengenali ini sebagai prosedur tersimpan, tetapi operasi API mungkin memiliki efek lebih dari sekadar basis data.
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?
Operasi API harus dipandang sebagai operasi tingkat yang lebih tinggi (daripada basis data) yang dapat menyebabkan banyak perubahan dalam sistem.
Perawatan menjadi lebih sulit
... karena klien Anda bergantung pada struktur basis data Anda.
Berdasarkan pengalaman saya dengan skenario ini:
- Anda tidak dapat mengganti nama atau menghapus tabel / kolom yang ada. Bahkan ketika nama mereka salah untuk fungsinya atau tidak lagi digunakan. Klien akan putus.
- Fitur-fitur baru tidak dapat mengubah struktur data yang ada, sehingga data dan fungsinya seringkali dipisahkan secara artifisial bahkan ketika itu secara holistik memiliki fitur yang ada.
- Basis kode secara bertahap menjadi lebih sulit untuk dipahami karena fragmentasi, nama yang membingungkan, dan bagasi sisa yang tidak dapat dihapus dengan aman.
- Semua kecuali perubahan sepele menjadi semakin berisiko dan memakan waktu.
- Sistem mandek dan akhirnya diganti.
Jangan memaparkan struktur basis data Anda secara langsung ke klien ... terutama klien yang tidak Anda miliki kendali perkembangannya. Gunakan API untuk mempersempit klien ke operasi yang sah saja.
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.