MongoDB'ye başlamadan önce keşke bilseydim dediğim 14 şey

Makalenin çevirisi kursun başlamasının arifesinde hazırlanmıştır. "İlişkisel olmayan veritabanları".

MongoDB'ye başlamadan önce keşke bilseydim dediğim 14 şey

Önemli:

  • MongoDB'de her ne kadar isteğe bağlı olsa da şema geliştirmek son derece önemlidir.
  • Benzer şekilde, dizinlerin şemanıza ve erişim kalıplarınıza uyması gerekir.
  • Büyük nesneler ve büyük diziler kullanmaktan kaçının.
  • Özellikle güvenlik ve güvenilirlik söz konusu olduğunda MongoDB ayarlarına dikkat edin.
  • MongoDB'nin sorgu iyileştiricisi bulunmadığından sorgu işlemlerini gerçekleştirirken dikkatli olmalısınız.

Çok uzun zamandır veritabanlarıyla çalışıyorum ancak MongoDB'yi daha yeni keşfettim. Onunla çalışmaya başlamadan önce keşke bilseydim dediğim birkaç şey var. Bir kişi belirli bir alanda zaten deneyime sahip olduğunda, veritabanlarının ne olduğu ve ne yaptığı konusunda önyargılı düşüncelere sahip olur. Başkalarının anlamasını kolaylaştırmak umuduyla, yaygın hataların bir listesini sunuyorum.

Kimlik doğrulaması olmadan MongoDB sunucusu oluşturma

Maalesef MongoDB varsayılan olarak kimlik doğrulaması yapılmadan kurulur. Yerel olarak erişilen bir iş istasyonu için bu uygulama normaldir. Ancak MongoDB, büyük miktarda bellek kullanmayı seven, çok kullanıcılı bir sistem olduğundan, yalnızca geliştirme amacıyla kullanacak olsanız bile, mümkün olduğunca fazla RAM'e sahip bir sunucuya koymanız daha iyi olacaktır. Sunucuya varsayılan bağlantı noktası aracılığıyla yükleme yapmak, özellikle istekte herhangi bir javascript kodu çalıştırılabiliyorsa sorunlu olabilir (örneğin, $where için bir fikir olarak enjeksiyon).

Birkaç kimlik doğrulama yöntemi vardır, ancak en kolayı bir kullanıcı kimliği/şifre belirlemektir. dayalı süslü kimlik doğrulamayı düşünürken bu fikri kullanın. LDAP. Güvenlik söz konusu olduğunda MongoDB sürekli güncellenmeli ve loglar her zaman yetkisiz erişimlere karşı kontrol edilmelidir. Örneğin, varsayılan bağlantı noktası olarak farklı bir bağlantı noktası seçmeyi seviyorum.

Saldırı yüzeyini MongoDB'ye bağlamayı unutmayın

MongoDB Güvenlik Kontrol Listesi Ağa izinsiz giriş ve veri sızıntısı riskini azaltmak için iyi ipuçları içerir. Bunu bir kenara bırakıp bir geliştirme sunucusunun yüksek düzeyde güvenliğe ihtiyaç duymadığını söylemek kolaydır. Ancak bu o kadar basit değil ve bu tüm MongoDB sunucuları için geçerli. Özellikle, kullanmak için zorlayıcı bir neden yoksa mapReduce, group veya $neredeyapılandırma dosyasına yazarak JavaScript'te rastgele kod kullanımını devre dışı bırakmanız gerekir. javascriptEnabled:false. Veri dosyaları standart MongoDB'de şifrelenmediğinden MongoDB'yi çalıştırmak mantıklıdır. Özel Kullanıcı, dosyalara tam erişime sahip, yalnızca sınırlı erişime sahip ve işletim sisteminin kendi dosya erişim kontrollerini kullanma becerisine sahip.

Devre geliştirilirken hata oluştu

MongoDB şema kullanmaz. Ancak bu, planın gerekli olmadığı anlamına gelmez. Belgeleri tutarlı bir düzen olmadan saklamak istiyorsanız, bunları kaydetmek hızlı ve kolay olabilir ancak daha sonra geri almak zor olabilir. Lanet olası sert.

Klasik makale "MongoDB Şema Tasarımı için 6 Temel Kural" Okumaya değer ve aşağıdaki gibi özellikler Şema Gezgini üçüncü taraf Studio 3T aracında, devrelerin düzenli kontrolleri için kullanılmaya değer.

Sıralama düzenini unutmayın

Sıralama düzeninin unutulması, diğer tüm yanlış yapılandırmalardan daha fazla hayal kırıklığına neden olabilir ve daha fazla zaman kaybına neden olabilir. Varsayılan olarak MongoBD şunu kullanır: ikili sıralama. Ancak kimseye faydalı olması pek mümkün değildir. Geçen yüzyılın 80'li yıllarında boncuklar, kaftanlar ve kıvırcık bıyıkların yanı sıra büyük/küçük harfe duyarlı, vurguya duyarlı, ikili türler de tuhaf anakronizmler olarak görülüyordu. Artık bunların kullanımı affedilemez. Gerçek hayatta "motosiklet", "Motosiklet" ile aynıdır. Ve “İngiltere” ve “İngiltere” aynı yerdir. Küçük harf, büyük harfin büyük harfe eşdeğeridir. Ve beni aksan işaretlerini ayırmaya başlatmayın. MongoDB'de bir veritabanı oluştururken vurguya duyarlı olmayan harmanlama kullanın ve kayıt olmakdile karşılık gelen ve sistem kullanıcı kültürü. Bu, dize verileri arasında arama yapmayı çok daha kolay hale getirecektir.

Büyük belgelerle koleksiyonlar oluşturun

MongoDB, koleksiyonlarda 16 MB'a kadar büyük belgeleri barındırmaktan mutluluk duyar ve IzgaraFS 16 MB'tan büyük büyük belgeler için tasarlanmıştır. Ancak büyük belgeler oraya yerleştirilebildiği için onları orada saklamak iyi bir fikir değildir. MongoDB, boyutu birkaç kilobayt olan ayrı belgeleri saklarsanız ve bunları geniş bir SQL tablosundaki satırlar gibi ele alırsanız en iyi şekilde çalışır. Büyük belgeler sorunların kaynağı olacaktır. üretkenlik.

Büyük dizilere sahip belgeler oluşturma

Belgeler diziler içerebilir. Dizideki öğe sayısının dört basamaklı bir sayıdan uzak olması en iyisidir. Bir diziye öğeler sık ​​sık eklenirse, dizi onu içeren belgeyi aşacaktır ve yeniden düzenlenmesi gerekecektir. hamleyani gerekli olacak indeksleri de güncelle. Büyük bir diziye sahip bir belgeyi yeniden indekslerken, indekslerin üzerine genellikle yazılır. kayıt, dizinini saklayan. Bu yeniden indeksleme, bir belge eklendiğinde veya silindiğinde de gerçekleşir.

MongoDB'de şöyle bir şey var: "doldurma faktörü"Bu sorunu en aza indirmek için belgelerin büyümesine yer sağlar.
Dizi indeksleme olmadan yapabileceğinizi düşünebilirsiniz. Ne yazık ki indekslerin eksikliği başka sorunlar yaşamanıza neden olabilir. Belgeler baştan sona tarandığından dizinin sonundaki öğelerin aranması daha uzun sürecektir ve bu tür bir belgeyle ilişkili çoğu işlem daha uzun sürecektir. yavaş.

Toplamadaki aşamaların sırasının önemli olduğunu unutmayın

Sorgu iyileştiricisi olan bir veritabanı sisteminde, yazdığınız sorgular, onu nasıl elde edeceğiniz değil, ne elde etmek istediğinizin açıklamalarıdır. Bu mekanizma bir restoranda sipariş vermeye benzetilerek çalışır: Genellikle sadece bir yemek sipariş edersiniz ve aşçıya ayrıntılı talimatlar vermezsiniz.

MongoDB'de aşçıya talimat verirsiniz. Örneğin, verilerin geçtiğinden emin olmanız gerekir. reduce kullanarak boru hattında mümkün olduğu kadar erken $match и $projectve sıralama ancak bundan sonra gerçekleşir reduceve aramanın tam olarak istediğiniz sırada gerçekleşmesini sağlar. Gereksiz işleri ortadan kaldıran, adımları en iyi şekilde sıralayan ve birleştirme türlerini seçen bir sorgu iyileştiriciye sahip olmak sizi şımartabilir. MongoDB ile kolaylık pahasına daha fazla kontrole sahip olursunuz.

Gibi araçlar Stüdyo 3T toplama sorgularının oluşturulmasını basitleştirecek MongoDB. Toplama Düzenleyicisi özelliği, işlem hattı ifadelerini her seferinde bir aşamada uygulamanıza ve hata ayıklamayı basitleştirmek için her aşamada giriş ve çıkış verilerini incelemenize olanak tanır.

Hızlı Kaydı Kullanma

MongoDB yazma seçeneklerini asla yüksek hıza ancak düşük güvenilirliğe sahip olacak şekilde ayarlamayın. Bu mod "dosyala ve unut" hızlı görünüyor çünkü komut yazma gerçekleşmeden önce döndürülüyor. Veriler diske yazılmadan önce sistem çökerse veriler kaybolacak ve tutarsız bir duruma düşecektir. Neyse ki 64-bit MongoDB'de günlük kaydı etkindir.

MMAPv1 ve WiredTiger depolama motorları bunu önlemek için günlük kaydı kullanır, ancak WiredTiger en son tutarlı veriyi kurtarabilir. kontrol noktasıGünlüğe kaydetme devre dışıysa.

Günlük tutma, veritabanının kurtarıldıktan sonra tutarlı bir durumda olmasını sağlar ve günlüğe yazılana kadar tüm verileri korur. Kayıtların sıklığı parametre kullanılarak yapılandırılır commitIntervalMs.

Girişlerden emin olmak için yapılandırma dosyasında günlüğe kaydetmenin etkinleştirildiğinden emin olun (storage.journal.enabled)ve kayıtların sıklığı, kaybetmeyi göze alabileceğiniz bilgi miktarına karşılık gelir.

İndeks olmadan sıralama

Arama ve toplama sırasında genellikle verileri sıralamaya ihtiyaç duyulur. Sıralanan veri miktarını azaltmak için bunun son aşamalardan birinde, sonucu filtreledikten sonra yapılmasını umalım. Ve bu durumda bile sıralama için ihtiyacınız olacak indeks. Tek veya bileşik indeks kullanabilirsiniz.

Uygun bir dizin yoksa MongoDB onsuz da yapacaktır. Tüm dokümanların toplam boyutunda 32 MB hafıza sınırı bulunmaktadır. sıralama işlemlerive MongoDB bu sınıra ulaşırsa ya bir hata atar ya da geri döner boş kayıt kümesi.

Dizin desteği olmadan arama yapın

Arama sorguları SQL'deki JOIN işlemine benzer bir işlev gerçekleştirir. En iyi şekilde çalışabilmek için yabancı anahtar olarak kullanılan anahtarın değer indeksine ihtiyaçları vardır. Bu açık değildir çünkü kullanım yansıtılmamıştır. explain(). Bu tür endeksler, burada yazılan endekse ektir. explain()boru hattı operatörleri tarafından da kullanılır $match и $sort, boru hattının başında buluştuklarında. Dizinler artık herhangi bir aşamayı kapsayabilir toplama boru hattı.

Çoklu güncellemeleri kullanmayı devre dışı bırakma

yöntem db.collection.update() Belirttiğiniz parametreye bağlı olarak, mevcut bir belgenin bir kısmını veya tamamını, hatta tamamen değiştirmeye kadar değiştirmek için kullanılır update. Çok açık olmayan şey, siz seçeneği ayarlamadığınız sürece koleksiyondaki tüm belgeleri işlemeyecek olmasıdır. multi İstek kriterlerini karşılayan tüm belgeleri güncellemek için.

Karma tablosundaki anahtarların sırasının önemini unutmayın

JSON'da bir nesne, boyutu sıfır veya daha fazla olan ad/değer çiftlerinin sırasız bir koleksiyonundan oluşur; burada name bir dizedir ve value bir dize, sayı, boolean, null, nesne veya dizidir.

Ne yazık ki BSON arama yaparken sıralamaya çok önem veriyor. MongoDB'de yerleşik nesneler içindeki anahtarların sırası hususlarIe { firstname: "Phil", surname: "factor" } - bu aynı şey değil { { surname: "factor", firstname: "Phil" }. Yani, bulduğunuzdan emin olmak istiyorsanız ad/değer çiftlerinin sırasını belgelerinizde saklamanız gerekir.

Karıştırmayın "Boş" и "Tanımsız"

Değer "Tanımsız" göre JSON'da hiçbir zaman geçerli değildi resmi standart JSON (ECMA-404 Bölüm 5), JavaScript'te kullanılmasına rağmen. Üstelik BSON için artık geçerliliğini yitirmiştir ve dönüştürülmüştür. $null, bu her zaman iyi bir çözüm değildir. Kullanmaktan kaçın "Tanımsız" MongoDB'de.

kullanımı $limit() olmadan $sort()

MongoDB'de geliştirme yaparken genellikle bir sorgudan veya toplamadan döndürülecek sonucun bir örneğini görmek yararlı olur. Bu görev için ihtiyacınız olacak $limit(), ancak daha önce kullanmadığınız sürece asla son kodda olmamalıdır $sort. Bu mekanik gereklidir çünkü aksi takdirde sonucun sırasını garanti edemezsiniz ve verileri güvenilir bir şekilde görüntüleyemezsiniz. Sonucun üst kısmında sıralamaya bağlı olarak farklı girişler göreceksiniz. Güvenilir bir şekilde çalışmak için sorguların ve toplamaların deterministik olması, yani her yürütüldüklerinde aynı sonuçları üretmeleri gerekir. Aşağıdakileri içeren kod $limit(), ama hayır $sortdeterministik olmayacak ve daha sonra takip edilmesi zor hatalara neden olabilecektir.

Sonuç

MongoDB konusunda hayal kırıklığına uğramanın tek yolu onu doğrudan DBMS gibi başka bir veritabanı türüyle karşılaştırmak veya belirli beklentilere göre kullanmaya başlamaktır. Portakalı çatalla karşılaştırmak gibi bir şey bu. Veritabanı sistemleri belirli amaçlara hizmet eder. Bu farklılıkları kendi başınıza anlamanız ve takdir etmeniz en iyisidir. MongoDB geliştiricilerine, onları DBMS yoluna girmeye zorlayan bir yol üzerinde baskı yapmak utanç verici olurdu. Veri bütünlüğünü sağlamak ve arızalara ve kötü niyetli saldırılara karşı dayanıklı veri sistemleri oluşturmak gibi eski sorunları çözmenin yeni ve ilginç yollarını görmek istiyorum.

MongoDB'nin 4.0 sürümünde ACID işlemselliğini sunması, önemli iyileştirmelerin yenilikçi bir şekilde sunulmasına iyi bir örnektir. Çoklu belge ve çoklu bildirim işlemleri artık atomiktir. Kilitleri almak ve takılı kalan işlemleri sonlandırmak için gereken süreyi ayarlamak ve izolasyon düzeyini değiştirmek de mümkündür.

MongoDB'ye başlamadan önce keşke bilseydim dediğim 14 şey

Daha fazla oku:

Kaynak: habr.com

Yorum ekle