Saya sedang mengerjakan proyek hobi yang disebut Menu / Recipe Management.
Beginilah rupa entitas saya dan relasinya.
A Nutrient
memiliki properti Code
danValue
An Ingredient
memiliki koleksiNutrients
A Recipe
memiliki Koleksi Ingredients
dan kadang-kadang dapat memiliki koleksi lainnyarecipes
A Meal
memiliki Koleksi Recipes
danIngredients
A Menu
memiliki KoleksiMeals
Relasi dapat digambarkan sebagai
Di salah satu halaman, untuk menu yang dipilih, saya perlu menampilkan informasi nutrisi yang efektif yang dihitung berdasarkan unsur-unsurnya (Makanan, Resep, Bahan dan nutrisi yang sesuai).
Sampai sekarang saya menggunakan SQL Server untuk menyimpan data dan saya menavigasi rantai dari kode C # saya, mulai dari setiap makan menu dan kemudian mengumpulkan nilai nutrisi.
Saya pikir ini bukan cara yang efisien karena perhitungan ini dilakukan setiap kali halaman diminta dan konstituen berubah sesekali.
Saya sedang berpikir tentang memiliki layanan latar belakang yang memelihara tabel yang disebut MenuNutrients ( {MenuId, NutrientId, Value}
) dan akan mengisi / memperbarui tabel ini dengan nutrisi yang efektif ketika salah satu komponen (Makanan, Resep, Bahan) perubahan.
Saya merasa bahwa GraphDB akan cocok untuk persyaratan ini, tetapi paparan saya ke NoSQL terbatas.
Saya ingin tahu apa alternatif solusi / pendekatan untuk persyaratan ini menampilkan nutrisi dari menu yang diberikan.
Semoga uraian saya tentang skenario ini jelas.
sumber
Jawaban:
Berdasarkan persyaratan dan arsitektur, mungkin ada opsi peningkatan kinerja:
Anda dapat menggunakan tampilan yang diindeks (matrialized) Untuk meningkatkan kinerja membaca pada tingkat RDBMS (Sql server).
Pada dasarnya, yang perlu Anda lakukan adalah:
Buat tampilan biasa.
Buat indeks berkerumun pada tampilan itu .
Menggunakan mekanisme pencairan di tingkat aplikasi akan meningkatkan kinerja.
Jika memungkinkan dan layak untuk menggunakan pencairan, memiliki strategi tunai seperti pencairan malas tunggal akan membantu Anda.
NoSql:
Ada banyak artikel bagus tentang Sql vs NoSql, seperti ini dan ini
Bagian menarik bagi saya:
Di mana harus menggunakan NoSql:
Saat digunakan siap untuk:
Selain memutuskan untuk menggunakan atau tidak menggunakan NoSql, artikel bermanfaat tentang NOSQL DBMS Comparison dan niat mereka dapat ditemukan di sini karena beberapa dari mereka berfokus pada membaca tinggi, menulis rendah, mengurangi peta, HA ...
Melihat-lihat di peringkat dan popularitas mereka , berdasarkan kategori mungkin berguna.
sumber
Saya sebenarnya Anda tidak perlu menggunakan grafik db, cukup simpan nilai yang diperlukan dalam satu tingkat atas. Ini seperti menyimpan
Order
danOrderItems
. Anda tidak harus menghitung total setiap kali pesanan akan ditampilkan. Sebaliknya Anda hanya menghitung jumlah, tong dan barang-barang lainnya dan menyimpannya denganOrder
.sumber
Saya menyarankan untuk melihat pola Segregasi Command Query Responsibility .
Pada dasarnya, alih-alih membuat model tunggal untuk membaca dan menulis, Anda dapat membuat 2 model berbeda. Satu dioptimalkan untuk memperbarui dan yang lainnya dioptimalkan untuk kueri (baca, pelaporan, ...). 2 model disinkronkan (biasanya dengan konsistensi akhirnya) menggunakan peristiwa domain (lihat DDD).
Saya mulai mempelajari pola ini beberapa bulan yang lalu dan itu benar-benar mengubah cara saya memodelkan perangkat lunak. Ini tidak mudah karena ini adalah perubahan besar, terutama bila digunakan dengan teknik lain seperti DDD dan Event Sourcing. Tapi sepadan dengan itu.
Ada banyak sumber daya yang tersedia di internet, cari CQRS dan DDD (dan akhirnya Event Sourcing).
Pola ini dapat digunakan pada SQL dan noSql.
Dalam kasus Anda, Anda dapat menjalankan suatu peristiwa setiap kali nutrisi diubah untuk memperbarui model baca yang dioptimalkan untuk dibaca. Model baca dapat misalnya tampilan denormalized dari nutrisi menu (mengapa tidak menggunakan nosql db untuk pembacaan yang efisien). Anda dapat memiliki beberapa model baca berdasarkan kueri yang perlu Anda lakukan.
Ada beberapa implikasi menggunakan pendekatan ini tetapi sangat terukur dan dapat dikembangkan.
sumber
Ini sangat tergantung pada bagaimana Anda melakukannya untuk mendapatkan menu dan nutrisi pada awalnya. Menurut Anda mengapa itu tidak efisien?
Dari apa yang saya mengerti, Anda pergi ke DB, dapatkan menu, lalu pergi lagi, dapatkan setiap resep, lalu pergi lagi dan dapatkan masing-masing bahan dan sebagainya. Ini benar-benar tidak efisien, karena ada banyak pertanyaan dan bolak-balik ke server, yang merupakan sumber utama keterlambatan. Ini dikenal sebagai masalah SELECT N +1.
Apa yang harus Anda lakukan adalah mengambil semua data dalam satu kueri, dengan menggunakan
JOIN
s untuk semua tabel dari menu hingga nutrisi, sehingga server DB dapat menggunakan semua hubungan dan indeks untuk mendapatkan data sekaligus. Aplikasi klien C # hanya memproses dan menampilkan hasil akhir. Melakukannya jauh lebih efisien daripada melakukannya satu per satu.Secara umum, menggunakan teknik kueri yang tepat dan indeks yang tepat untuk kueri kritis, basis data relasional dapat berkinerja sangat baik pada tabel besar yang sedang dimuat.
sumber
JOIN
yang seharusnya tidak menjadi beban pada server (kecuali jika kita berbicara tentang mengambil ratusan atau ribuan baris), jika pengindeksan yang tepat ada di tempat. Bahkan dengan kumpulan data besar, Anda selalu dapat membangun tampilan pada seluruh hasil, dan bahkan mengindeks tampilan untuk memiliki hasil yang dihitung sebelumnya, jika kinerja pernah menjadi masalah.Sepertinya Anda telah menghabiskan waktu memikirkan cara terbaik untuk memodelkan data sehingga dapat dengan mudah diperbarui dan ditanya. Namun, sekarang Anda berada pada titik di mana Anda perlu menyediakan akses ke data. Kedua hal itu merupakan masalah tersendiri.
Anda menyebutkan memuat ulang halaman menyebabkan kueri baru ke database. Anda juga menyebutkan bahwa basis data sesekali akan diperbarui dan ketika Anda menginginkan pembaruan itu ditampilkan pada halaman secara tepat waktu. Metode terbaik Anda untuk mengurangi overhead kueri adalah tidak melakukannya. Jika Anda menjalankan kueri yang sama berulang-ulang dan mendapatkan hasil yang sama, mengapa tidak menyimpannya untuk sementara waktu? Anda harus dapat mengimplementasikan beberapa caching di bagian hulu tanpa mengubah sisa proyek. Saya akan merekomendasikan membaca tentang istirahat. Terlepas dari apakah Anda mengimplementasikan proyek dalam masalah rdbms atau nosql dengan kinerja jenis ini yang terbaik ditangani dengan mengurangi berapa kali Anda harus pergi ke database. Katakanlah Anda memiliki 100 permintaan untuk resep yang sama dalam 60 detik. Jika Anda melakukan cache selama 60 detik maka Anda hanya perlu menekan database sekali jadi itu adalah peningkatan kinerja 100x. Untuk melihat tingkat peningkatan yang sama dengan beralih ke nosql akan membutuhkan lebih banyak pekerjaan.
Sistem tipe Nosql dapat menjadi solusi yang bagus ketika Anda memiliki data dalam jumlah besar atau persyaratan kecepatan baca atau tulis yang ekstrem. Namun kinerja tambahan itu datang dengan biaya membuang hal-hal seperti integritas referensial.
sumber
Sepertinya untuk percobaan atau tujuan pengetahuan Anda ingin mencoba Graph-DB tetapi contoh Anda jelas merupakan contoh data hierarkis di mana kami dapat menelusuri-turun / naik melalui sebuah node. Saya bukan ahli Grafik / Neo DB namun saya bisa melihat tidak ada banyak kerumitan dalam cara pengguna / Anda dapat meminta data dari skema ini. Saya melihat pilihan desain database / skema sangat tergantung pada bagaimana dan tipe data apa yang akan dipertanyakan. Saat Anda menggunakan SQLSERVER "HierarchyI" D adalah pilihan terbaik dari sudut pandang saya untuk meletakkan node ini sebagai bagian dari Tree.
sumber
Saran saya adalah berpikir seperti mesin dan bukan seperti manusia. Ini mungkin terlihat berulang-ulang, tetapi mesin apa yang bagus. Satu hal yang harus Anda tanyakan pada diri sendiri adalah "apakah saya harus mengambil setiap objek, untuk ditampilkan di halaman saya?" Jika ya, lanjutkan apa yang Anda lakukan, dibandingkan dengan pengambilan data, siklus cpu dapat diabaikan saat melakukan matematika sederhana.
sumber