Saya membuat API yang tenang. Saya berjuang untuk memutuskan cara terbaik untuk merancang tabel database saya di sekitar sumber daya saya.
Awalnya, saya pikir tabel per sumber daya akan menjadi cara yang baik untuk pergi, tetapi saya sekarang khawatir bahwa ini akan menghasilkan tabel secara eksponensial lebih besar semakin jauh ke bawah rantai sumber daya yang Anda tuju.
Sebagai contoh, bayangkan saya memiliki tiga sumber daya - pengguna, klien, penjualan. Pengguna adalah pelanggan api saya, klien adalah pelanggan pengguna, dan penjualan adalah pembelian yang dilakukan oleh setiap klien ke akun pengguna.
Sumber daya penjualan diakses sebagai berikut
GET /users/{userID}/clients/{clientID}/sales/{salesID}
Jadi jika ada 10 pengguna, masing-masing dengan 10 pelanggan, dan untuk setiap pelanggan ada 10 penjualan, ukuran tabel semakin besar semakin jauh ke bawah rantai sumber daya yang kami tuju.
Saya cukup yakin bahwa SQL dapat mengatasi tabel besar, tapi saya tidak yakin bagaimana membaca dan menulis akan memperlambat segalanya. Contoh di atas mungkin tidak menggambarkannya, tetapi api saya akan memiliki semakin banyak menulis dan membaca lebih lanjut di rantai sumber daya yang kita tuju. Karena itu saya punya skenario di mana tabel terbesar di database saya, akan dibaca dan ditulis lebih dari kali tabel kecil.
Gabungan tabel juga diperlukan sebelum menjalankan kueri. Alasannya adalah bahwa saya mengizinkan setiap pengguna untuk memiliki klien dengan nama yang sama. Untuk menghindari kesalahan data klien, tabel pengguna dan tabel klien digabungkan dengan {userID}. Ini juga berlaku untuk penjualan. Akankah bergabung dengan meja besar dan menjalankan membaca dan menulis memperlambat lebih lanjut?
Database relasional (karenanya SQL) sangat bagus untuk menemukan satu (atau beberapa) baris dari tabel besar. Inilah gunanya indeks. Mereka juga cukup hebat dalam menangani gabungan. Anda tidak benar-benar memiliki pertanyaan . Yang tersirat, Anda pada dasarnya bertanya tentang bagaimana melakukan desain basis data multi-tenant. Saya sarankan Anda membaca Arsitektur Data Multi-Tenant sebelum mengajukan pertanyaan lebih lanjut. Pilih salah satu pola (database terpisah, skema terpisah database bersama, skema berbagi database bersama) dan kemudian kami dapat mendiskusikan secara spesifik. Saat ini Anda hanya membayangkan pola terakhir, tetapi tidak mempertimbangkan pro dan kontra. Baca.
Sebagai catatan: Anda tidak perlu
user/{userID}
di URI. Anda mengetahui penyewa (userID) dari info otentikasi.sumber
user_id
sebagai kunci untuk setiap tabel dan menambahkanleft.user_id = right.user_id
ke gabungan yang relevan (biasanya, semua). Beberapa ORM mendukung untuk menghentikan akses. Dan jangan tertipu, pengguna Anda adalah penyewa, karena Anda tidak ingin pengguna 'foo' melihat / memodifikasi penjualan 'bar' pengguna.Hanya untuk menambah apa yang telah dikatakan di sini - Anda mungkin ingin membangun antarmuka antara API aktual dan lapisan basis data Anda. Itu membuat menambahkan tabel caching dan ringkasan lebih mudah ...
sumber