Desain istirahat - Beberapa panggilan vs. mengembalikan semua data dalam satu panggilan

8

Saya mencoba membuat API sisanya untuk aplikasi android. Misalkan saya punya userstabel dengan (id, name, email)dan songsmeja dengan (id, song_name, album)dan kaya bergabung hubungan antara mereka sebagai streamsmemiliki (user_id, song_id, listen_count). Saya ingin mengambil detail tentang semua aliran dan menunjukkannya di aplikasi sebagai daftar. Daftar akan menampilkan nama lagu, nama album, nama pengguna dan jumlah mendengarkan. Saya melihat tiga opsi yang masuk akal -

  1. GETke /streamsdan mengambil daftar semua song_idsdan user_ids. Kemudian buat GETke /user/:iddan /song/:iduntuk setiap pengguna dan id lagu untuk mendapatkan informasi pengguna dan lagu.
  2. GETke /streamsdan mengambil daftar semua user_idsdan song_ids. Kemudian salah satu GETuntuk /user?ids=<comma_separated_ids>mengambil informasi tentang semua pengguna dan GETuntuk song?ids=<comma_separated_ids>mengambil informasi tentang semua lagu.
  3. GETuntuk /streamsdan mengambil semuanya dalam satu panggilan. Sesuatu seperti -

    [
    
      {
    
        "user_id" : 10,
        "song_id" : 14,
        "listen_count" : 5,
        "user" : {
          "id"     : 10,
          "name"   : "bla", 
          "email"  : "bla",
        },
        "song" : {
          "id"     : 14,
          "name"   : "blu",
          "album"  : "blu"
       }
      },
    ...
    ]
    

Saya tergoda untuk menggunakan opsi 3 karena memberi saya segalanya dalam satu panggilan, tetapi saya tidak berpikir itu sangat tenang dan saya khawatir itu tidak akan terukur. Opsi 2 baik tetapi dibutuhkan 3 panggilan yang berarti cukup banyak waktu memuat daftar. Dan opsi 1 mengikuti istirahat tetapi akan menerima banyak panggilan untuk menunjukkan daftar dan melakukan begitu banyak panggilan dari perangkat seluler tidak layak.

Apa yang akan menjadi cara yang disarankan untuk melakukan ini?

aanda
sumber
Seperti istirahat dan laku adalah dua hal yang berbeda.
Robert Harvey
@RobertHarvey, bagaimana maksud Anda?
aandis
Apa yang membuat Anda berpikir kualitas antarmuka REST Anda memengaruhi salability suatu produk? Apakah Anda benar-benar menjual antarmuka REST? Jika tidak, tidak ada yang peduli apa yang ada di bawah tenda. Lihat juga meta.stackexchange.com/q/142353
Robert Harvey
1
Ada overhead yang unik dalam membuat panggilan REST. Akibatnya, ada kemungkinan kuat bahwa 3 adalah pendekatan terbaik dari sudut pandang skalabilitas, terutama jika Anda menggunakan semua data sehingga dikembalikan.
Robert Harvey
1
Terkait dengan cara programmer.stackexchange.com/q/257408/56903
toniedzwiedz

Jawaban:

6

Saat membuat antarmuka REST, tidak ada persyaratan, atau bahkan harapan, bahwa respons pada antarmuka REST berhubungan langsung dengan tabel atau bergabung dalam database.

/streamsAntarmuka Anda dapat dengan mudah direpresentasikan sebagai

[
  {
    "listen_count" : 5,
    "user" : {
      "href"     : "/users/10",
      "name"   : "bla", 
    },
    "song" : {
      "href"     : "/songs/14",
      "name"   : "blu",
      "album"  : "blu"
    }
  },
  ...
]

Di mana objek JSON berisi detail utama pengguna dan lagu yang (hampir) selalu relevan bagi konsumen sumber daya streaming, dan tautan ke sumber daya pengguna / lagu yang relevan jika diperlukan rincian lebih lanjut.

Ini pada dasarnya adalah variasi dari opsi ketiga Anda, dengan mundur ke opsi 1 jika diperlukan lebih banyak detail.

Bart van Ingen Schenau
sumber
Tidak ada jawaban yang terjamin bagi saya, orang-orang ... opsi 3 bisa sederhana jika domain tetap sederhana tetapi itu akan membuat Anda dalam kesulitan untuk objek yang melihat lebih dari dua tingkat penggabungan. Misalnya, Anda ingin mengambil semua Program yang tersedia dengan data guru mereka. Anda memiliki Course-> Teacher(informasi tentang orang tersebut sebagai guru, disimpan dalam tabel terpisah) -> Person(orang fisik, seperti yang Anda ingat orang yang sama dapat menjadi guru dari beberapa Kursus). Opsi 2 scalable, dan membutuhkan * permintaan. Juga memilih. 1 juga dapat diskalakan, tetapi bisa membutuhkan >> permintaan.
Victor
Jadi untuk mensintesis komentar di atas: jika Anda mencari efisiensi, maka usahakan untuk nomor 1, tetapi jika Anda mencari sistem yang dapat tumbuh tanpa masalah dalam waktu (skalabilitas) tanpa memberikan sakit kepala, bertujuan untuk opsi 1 atau 2. Ini layak untuk menyebutkan bahwa optimisasi dini adalah akar kejahatan ... jadi ini adalah peringatan untuk opsi 3.
Victor
perlu memperbaiki diri sendiri di atas .. "jika Anda mencari efisiensi, maka berjuang untuk nomor 3"
Victor
3

Anda pasti menginginkan satu GEToperasi yang mengembalikan metadata tentang setiap lagu dan pengguna selain id buram mereka.

  • Seperti yang Anda tunjukkan, ini jauh lebih sederhana. Itu hal yang baik.
  • Membuat salah satu operasi paling umum untuk aplikasi klien Anda sebagai permintaan server tunggal alih-alih permintaan O (n) jauh lebih skalabel. Dalam jangka panjang, jaringan akan menjadi hambatan terbesar Anda, jadi Anda tidak ingin mengirim permintaan lebih dari yang seharusnya.
  • Id sendiri agak tidak berguna kecuali untuk membuat panggilan REST tambahan.
  • Selama metadata Anda memiliki ukuran yang relatif kecil dan terbatas (mis. Tidak ada halaman teks deskriptif atau file audio aktual, hanya nama, tipe, jumlah, dan sebagainya) mengembalikannya sebagai tambahan id tidak akan menjadi masalah kinerja.
Ixrec
sumber
Menarik. Tetapi opsi 3 tidak benar-benar mematuhi rest-fulldesain, bukan? Sebuah GETuntuk streams harus mengembalikan semua streamsdan tidak ada yang lain (bahkan jika mereka hanya id dan berguna untuk klien).
aandis
2
@ zack Dalam arti yang paling ketat, ya, tetapi prinsip desain apa pun bisa terlalu jauh. Ketika Anda mendapati diri Anda berdebat bahwa program harus melakukan sesuatu yang tidak berguna , itu biasanya bukan pertanda baik.
Ixrec
Metadata adalah data tentang data, ini hanya data.
Jacob Raihle
@ zack: Suatu streamssumber daya dapat secara logis mengandung (bagian dari) sumber daya lainnya. Hal-hal yang secara logis merupakan bagian dari sumber daya harus ada dalam representasi sumber daya itu.
Bart van Ingen Schenau
1
@ zack opsi 3 sepenuhnya 100% TENANG. Sumber yang Anda paparkan melalui API Anda tidak memiliki persyaratan untuk berhubungan dengan hal lain di sistem Anda, termasuk tabel DB dan model domain Anda. Anda bisa memiliki 3 tabel database dan 600 sumber daya jika itu masuk akal untuk aplikasi web Anda. Tidak ada persyaratan untuk mewakili hubungan DB Anda dalam hubungan Sumber Daya Anda.
Cormac Mulhall