Misalnya, katakan saya ingin mengambil Pengguna dan semua nomor telepon serta alamat emailnya. Nomor-nomor telepon dan email disimpan dalam tabel terpisah, Satu pengguna ke banyak telepon / email. Saya bisa melakukan ini dengan mudah:
SELECT * FROM users user
LEFT JOIN emails email ON email.user_id=user.id
LEFT JOIN phones phone ON phone.user_id=user.id
Masalah * dengan ini adalah bahwa itu mengembalikan nama pengguna, DOB, warna favorit, dan semua informasi lain yang disimpan dalam tabel pengguna berulang-ulang untuk setiap catatan (pengguna email catatan telepon), mungkin memakan bandwidth dan memperlambat bawah hasilnya.
Bukankah lebih baik jika mengembalikan satu baris untuk setiap pengguna, dan dalam catatan itu ada daftar email dan daftar telepon? Itu akan membuat data lebih mudah untuk dikerjakan.
Saya tahu Anda bisa mendapatkan hasil seperti ini menggunakan LINQ atau mungkin kerangka kerja lain, tetapi tampaknya menjadi kelemahan dalam desain yang mendasari database relasional.
Kita bisa menyiasatinya dengan menggunakan NoSQL, tetapi tidakkah seharusnya ada jalan tengah?
Apakah saya melewatkan sesuatu? Mengapa ini tidak ada?
* Ya, didesain seperti ini. Saya mengerti. Saya bertanya-tanya mengapa tidak ada alternatif yang lebih mudah untuk dikerjakan. SQL dapat terus melakukan apa yang dilakukannya tetapi kemudian mereka dapat menambahkan satu atau dua kata kunci untuk melakukan sedikit pemrosesan pasca yang mengembalikan data dalam format bersarang alih-alih produk kartesius.
Saya tahu ini dapat dilakukan dalam bahasa scripting pilihan Anda, tetapi mengharuskan server SQL baik mengirim data yang berlebihan (contoh di bawah) atau agar Anda mengeluarkan beberapa pertanyaan seperti SELECT email FROM emails WHERE user_id IN (/* result of first query */)
.
Alih-alih meminta MySQL mengembalikan sesuatu yang mirip dengan ini:
[
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"email": "johnsmith45@gmail.com",
},
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"email": "john@smithsunite.com",
},
{
"name": "Jane Doe",
"dob": "1953-02-19",
"fav_color": "green",
"email": "originaljane@deerclan.com",
}
]
Dan kemudian harus mengelompokkan pada beberapa pengidentifikasi unik (yang berarti saya perlu mengambil itu juga!) Sisi klien untuk memformat ulang hasil yang ditetapkan seperti yang Anda inginkan, cukup kembalikan ini:
[
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"emails": ["johnsmith45@gmail.com", "john@smithsunite.com"]
},
{
"name": "Jane Doe",
"dob": "1953-02-19",
"fav_color": "green",
"emails": ["originaljane@deerclan.com"],
}
]
Sebagai alternatif, saya dapat mengeluarkan 3 pertanyaan: 1 untuk pengguna, 1 untuk email, dan 1 untuk nomor telepon, tetapi kemudian set hasil email dan nomor telepon harus berisi user_id sehingga saya dapat mencocokkannya kembali dengan pengguna. Saya sebelumnya mengambil. Sekali lagi, data yang berlebihan dan pasca pengolahan yang tidak perlu.