Örneğin, bir Kullanıcıyı ve tüm telefon numaralarını ve e-posta adreslerini almak istediğimi varsayalım. Telefon numaraları ve e-postalar ayrı tablolarda saklanır, Bir kullanıcıya birçok telefon / e-posta. Bunu oldukça kolay bir şekilde yapabilirim:
SELECT * FROM users user
LEFT JOIN emails email ON email.user_id=user.id
LEFT JOIN phones phone ON phone.user_id=user.id
Buradaki sorun * kullanıcının adı, DOB, favori rengi ve kullanıcı tablosunda saklanan diğer tüm bilgilerin her kayıt için tekrar tekrar geri dönmesidir (kullanıcılar telefon kayıtlarını e-posta ile gönderir), muhtemelen bant genişliğini tüketir ve yavaşlar sonuçları.
Her kullanıcı için tek bir satır döndü ve o kaydın içinde olsaydı daha güzel olmaz mıydı liste e-postaların ve bir liste telefonlarının? Verilerin çalışması da çok daha kolay olur.
LINQ veya belki de başka çerçeveler kullanarak böyle sonuçlar alabileceğinizi biliyorum, ancak ilişkisel veritabanlarının temel tasarımında bir zayıflık gibi görünüyor.
NoSQL kullanarak bu sorunu çözebiliriz, ancak orta yol olmamalı mı?
Bir şey mi kaçırıyorum? Bu neden mevcut değil?
* Evet, bu şekilde tasarlanmıştır. Anladım. Neden çalışmak daha kolay bir alternatif olmadığını merak ediyorum. SQL yaptıklarını yapmaya devam edebilir, ancak daha sonra verileri kartezyen bir ürün yerine iç içe bir biçimde döndüren biraz işlem sonrası yapmak için bir veya iki anahtar kelime ekleyebilirler.
Bu, seçtiğiniz bir betik dilinde yapılabilir, ancak SQL sunucusunun yedekli veri (aşağıdaki örnek) göndermesini veya sizin gibi birden fazla sorgu göndermenizi gerektirir SELECT email FROM emails WHERE user_id IN (/* result of first query */)
.
MySQL'in buna benzer bir şey döndürmesi yerine:
[
{
"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",
}
]
Ve sonra sonuç kümesi nasıl istediğinizi yeniden biçimlendirmek için istemci tarafında bazı benzersiz tanımlayıcı gruplamak zorunda (yani ben de getirmek gerekir!), Sadece şunu döndürmek:
[
{
"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"],
}
]
Alternatif olarak, 3 sorgu gönderebilirim: kullanıcılar için 1, e-postalar için 1 ve telefon numaraları için 1, ancak daha sonra e-posta ve telefon numarası sonuç kümelerinin kullanıcılarla eşleşebilmesi için user_id içermesi gerekir Daha önce getirmiştim. Yine, gereksiz veriler ve gereksiz işlem sonrası.