Bu soru üzerine tökezledim ve eski bir soru olmasına rağmen, verilen cevaplarda belirtilmeyen birkaç olasılık eklemenin yararlı olacağını düşündüm. Ayrıca, son birkaç yılda işler biraz ilerledi, bu nedenle SQL ve NoSQL'in birbirine yaklaştıklarını vurgulamakta fayda var.
Yorumculardan biri, “veriler ilişkisel ise ilişkisel kullanın” konusunda akıllıca uyarıcı tavır getirdi. Bununla birlikte, bu yorum sadece şemaların her zaman uygulamadan önce geldiği ilişkisel dünyada mantıklıdır.
İLİŞKİ DÜNYA: Yapı verileri> Onu almak için uygulama yaz
NOSQL WORLD: Tasarım uygulaması> Buna göre yapı verileri
Veriler ilişkisel olsa bile, NoSQL hala bir seçenektir. Örneğin, bire çok ilişkiler hiç sorun değil ve MongoDB belgelerinde geniş yer kaplıyor
2010 SORUNUNA 2015 ÇÖZÜMÜ
Bu soru gönderildiği için, noSQL'i SQL'e yaklaştırmaya yönelik ciddi girişimler olmuştur. California Üniversitesi'nde (San Diego) Yannis Papakonstantinou liderliğindeki ekip , yakında burada açıklanan gibi kalıcı sorunların çözümü olabilecek bir SQL ++ uygulaması olan FORWARD üzerinde çalışıyor .
Daha pratik bir seviyede, Couchbase 4.0'ın piyasaya sürülmesi, ilk kez NoSQL'de yerel JOIN'ler yapabileceğiniz anlamına geliyordu. Kendi N1QL'lerini kullanıyorlar. Bu bir örnektir JOIN
onların arasından öğreticiler :
SELECT usr.personal_details, orders
FROM users_with_orders usr
USE KEYS "Elinor_33313792"
JOIN orders_with_users orders
ON KEYS ARRAY s.order_id FOR s IN usr.shipped_order_history END
N1QL, toplama, filtreleme vb.Dahil olmak üzere tüm SQL işlemlerine olmasa da çoğuna izin verir.
YENİ OLMAYAN HİBRİT ÇÖZÜM
MongoDB hala tek seçenekse, uygulamanın veri yapısı üzerinde önceliğe sahip olması gerektiğine geri dönmek istiyorum. Yanıtların hiçbiri, sorgulanan verilerin çoğunun belgeye / nesneye gömüldüğü ve az sayıda vaka için referansların tutulduğu hibrit yerleştirmeden bahsetmez.
Örnek: Bilgi (rol adı dışında) bekleyebilir mi? Kullanıcının henüz ihtiyaç duymadığı bir şey istemeyerek uygulamanın önyüklemesi daha hızlı olabilir mi?
Bu, kullanıcının oturum açması ve ait olduğu tüm roller için tüm seçenekleri görmesi gerektiğinde olabilir. Ancak, kullanıcı bir "Mühendis" dir ve bu rol için seçenekler nadiren kullanılır. Bu, uygulamanın yalnızca bir mühendisin üzerine tıklamak istemesi durumunda seçeneklerini göstermesi gerektiği anlamına gelir.
Bu, uygulamaya başlangıçta (1) kullanıcının ait olduğu rolleri ve (2) belirli bir role bağlı bir olay hakkında nereden bilgi alınacağını bildiren bir belge ile gerçekleştirilebilir.
{_id: ObjectID(),
roles: [[“Engineer”, “ObjectId()”],
[“Administrator”, “ObjectId()”]]
}
Daha da iyisi, roller koleksiyonundaki role.name alanını dizine eklediğinizde, ObjectID () öğesini de yerleştirmeniz gerekmeyebilir.
Başka bir örnek: TÜM roller hakkında bilgi TÜM zamanlar isteniyor mu?
Kullanıcının kontrol panelinde oturum açması ve zamanın% 90'ının “Mühendis” rolüne bağlı görevleri gerçekleştirmesi de olabilir. Karma yerleştirme tam olarak bu rol için yapılabilir ve yalnızca geri kalanı için referansları tutabilir.
{_id: ObjectID(),
roles: [{name: “Engineer”,
property1: value1,
property2: value2
},
[“Administrator”, “ObjectId()”]
]
}
Şematik olmak sadece NoSQL'in bir özelliği değildir, bu durumda bir avantaj olabilir. Bir kullanıcı nesnesinin "Roller" özelliğinde farklı türdeki nesneleri yuvalamak mükemmel bir şekilde geçerlidir.