Mewakili daftar yang dipesan adalah salah satu masalah sulit dengan database relasional. Menambahkan properti posisi ke hubungan daftar-keanggotaan adalah cara paling umum untuk melakukan ini, karena Anda dapat dengan mudah mengambil daftar yang diurutkan dengan menambahkan ORDER BY position
ke permintaan SQL Anda, dan karena Anda dapat dengan mudah memasukkan item di tengah daftar dengan rata-rata nilai anggota daftar sebelumnya dan selanjutnya, dengan asumsi posisi adalah float daripada integer.
Menggunakan daftar yang ditautkan dua kali harus dihindari, karena mudah untuk secara tidak sengaja membuat tautan tidak konsisten, dan berakhir dengan grafik atau pohon siklik sebagai gantinya.
Namun, API tenang tidak menderita dari pembatasan database relasional. Anda bisa melakukan sesuatu yang terasa alami, daripada menggunakan peretasan seperti properti posisi.
Jika Anda hanya memiliki beberapa ratus elemen dalam daftar, cukup transfer seluruh daftar dalam permintaan. Dengan asumsi kami ingin menyusun ulang di [1, 2, 3, 4]
mana anggota daftar adalah ID, kami bisa
POST /url/of/the/list
Content-type: application/json
...
[1, 2, 4, 3]
Backend kemudian dapat menerjemahkan ini ke teknologi database apa pun yang Anda gunakan, tetapi pengguna API tidak harus mempertimbangkan detail ini.
Jika daftar besar dan item biasanya akan diminta secara individual, Anda dapat mengizinkan indeks di url:
GET /page/7
Jika Anda menyukai HATEOAS, responsnya dapat mencakup tautan prev / next untuk menyederhanakan navigasi, jika sumber daya biasanya dikonsumsi seperti itu. Namun, ini tidak perlu menyiratkan bahwa database Anda juga berisi daftar yang ditautkan dua kali lipat ini.
Jika daftar ini sangat besar, Anda mungkin ingin mengekspos ArrayList
operasi seperti-seperti insert
atau push
/ append
. Saya bisa membayangkan panggilan seperti itu
POST /url/of/the/list?at=1357;mode=insert
...
description of the item to insert
Jika pemesanan ulang adalah kasus penggunaan umum dan pemesanan ulang harus dilakukan segera, maka Anda dapat menawarkan titik akhir yang sesuai di API Anda:
POST /url/of/the/list/reorder-item?from=783;to=1357
Jika daftar yang dipesan ulang harus dilakukan secara eksplisit, akan lebih mudah untuk mentransfer pesanan baru sebagai dokumen JSON, lihat di atas.
Sekarang tidak sepenuhnya benar bahwa Anda dapat melihat API Anda sepenuhnya terpisah dari teknologi basis data yang Anda gunakan. Namun, yang terbaik adalah menjaga API eksternal sebebas mungkin dari detail implementasi. Jika pemesanan ulang menyentuh sekitar 30 baris hanya untuk memperbarui kolom pesanan integer, itu bukan masalah besar. Lakukan saja hal yang paling sederhana dan perbarui seluruh daftar. Jika skala Anda mengharuskan penggunaan basis data Anda menjadi lebih canggih, lebih baik menangkap kecanggihan ini di backend, di mana lebih mudah untuk mempertahankan konsistensi.