MongoDB ilişkiler: referans gömmek?
--İlişkisel bir veritabanı arka plan gelen MongoDB yeniyim. Bazı yorumlar ile bir soru yapısı tasarım yapmak istiyorum, ama yorum için kullanılacak bilmiyorum: embed
reference
?
Bazı yorumlar şöyle: stackoverflow gibi bir soru böyle bir yapıya sahip:
Question
title = 'aaa'
content = bbb'
comments = ???
İlk başta, gömülmüş açıklamalar (embed
MongoDB tavsiye edilir bence), bu gibi kullanmak istiyorum:
Question
title = 'aaa'
content = 'bbb'
comments = [ { content = 'xxx', createdAt = 'yyy'},
{ content = 'xxx', createdAt = 'yyy'},
{ content = 'xxx', createdAt = 'yyy'} ]
Ama bu durum için endişeleniyorumEğer belirli bir yorum düzenlemek istiyorum, nasıl kendi içeriği ve soru alabilirim?_id
bulmama izin yok, ne question_ref
bana soru bulalım. (_id
question_ref
.) olmadan bunu yapmak için herhangi bir yolu varsa bilmiyorum o kadar acemi değilim
Kullanmak zorunda ref
embed
olmaz mı? Sonra yorumlar için yeni bir koleksiyon oluşturmak zorunda mıyım?
CEVAP
Bu bilimden çok bir sanattır. Mongo Documentation on Schemas iyi bir referanstır, ama burada dikkat etmeniz gereken bazı şeyler şunlardır:
Mümkün olduğunca koymak
Belge bir veritabanı sevinç Katıldı sürü ortadan kaldırır. İlk içgüdüsü gibi tek bir belge kadar yer olmalıdır. MongoDB belgeleri verimli bir şekilde bu yapı içinde sorgu yapabilirsiniz çünkü yapısı, ve çünkü SQL gibi veri normalleştirmek için acil ihtiyaç yok. Özellikle yararlı arayla üst belgedeki veriler aynı belge parçası olmalıdır.
Çeşitli yerlerden havale olabilir o ayrı veri kendi koleksiyonu.
Bu "depo alanı" tutarlılık "sorunu. veri olarak" sorun bu kadar değil. Eğer çok kayıt aynı verilere bakın Eğer daha verimli ve daha az hata eğilimli tek bir kayıt ve güncelleme başvuruları tutmak için diğer yerlerde.
Belge değerlendirmeleri boyutu
MongoDB tek bir belge üzerinde 4 MB (1.8 ile 16 MB) boyutu sınırı uygular. Veri GB dünyasında bu küçük görünüyor, ama aynı zamanda 30 milyon Tweet ya da 250 bin tipik Taşma cevaplar ya da 20 flicker fotoğraf Yığını. Öte yandan, bu tipik bir web sayfasında aynı anda isteyebilirsin o zaman çok daha fazla bilgi vardır. Sorularınıza daha kolay hale getirecek ne ilk düşünün. Birçok durumda belge boyutları hakkında endişe erken optimizasyonu olacak.
Karmaşık veri yapıları:
MongoDB keyfi iç içe geçmiş yapıları veri deposu, ancak bunları verimli bir şekilde arama yapabilirsiniz. Eğer verilerinizi bir ağaç, orman ya da grafik formlar, etkili bir şekilde ayrı bir belge içinde her düğüm ve kenarları saklamanız gerekir. (Veri depoları özellikle de düşünmelisiniz bu tür veri) için tasarlanmış olduğunu unutmayın
Ayrıca imkansız bir belgedeki öğelerin bir alt kümesini döndürmek için daha been pointed out vardır. Eğer pick-ve-tercih her belgenin birkaç bit gerekiyorsa, onları ayırmak için daha kolay olacaktır.
Veri Tutarlılığı
MongoDB bir ticaret verimlilik ve tutarlılık arasında yapar. Bu kuralı bir tek belge olan değişikliklerher zamanbirden fazla belge güncelleştirmeleri hiçbir zaman atom olarak kabul edilmesi gerekirken, atom,. Ayrıca "(istemci mantığı örneğin" kilit "field) kullanarak bunu yapabilir misin sunucuda" bir kayıt kilitleme yolu yok Size şema tasarlarken veri tutarlı tutmak nasıl düşünün. Bir belge içinde kalmasını genellikle, daha iyi.
Bütün bunlar ne için, yorum gömmek, ve her bir yorum bir Objectıd ile bir kimlik alanı verirdim. Objectıd kullanmak yerine Eğer isterseniz de oluşturulmuş, böylece zaman damgası durmasına yardımcı olur.
GitHub wiki (gollum) bir depo içine gö...
PHP uyarı: Arama referans olarak geçme...
Nasıl 'saf' Swift zayıf bir ...
MongoDB Şema Tasarım - Çok küçük belge...
En üstteki görünüm için referans almak...