Makalenin çevirisi kursun başlamasının arifesinde hazırlanmıştır.
Ö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
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.
Saldırı yüzeyini MongoDB'ye bağlamayı unutmayın
,
veya
. Veri dosyaları standart MongoDB'de şifrelenmediğinden MongoDB'yi çalıştırmak mantıklıdır.
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.
Klasik makale "
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:
Büyük belgelerle koleksiyonlar oluşturun
MongoDB, koleksiyonlarda 16 MB'a kadar büyük belgeleri barındırmaktan mutluluk duyar ve
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.
MongoDB'de şöyle bir şey var:
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.
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
и $project
ve sıralama ancak bundan sonra gerçekleşir reduce
ve 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
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.
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
.
Girişlerden emin olmak için yapılandırma dosyasında günlüğe kaydetmenin etkinleştirildiğinden emin olun
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
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.
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
Çoklu güncellemeleri kullanmayı devre dışı bırakma
yöntem
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
. Çok açık olmayan şey, siz seçeneği ayarlamadığınız sürece koleksiyondaki tüm belgeleri işlemeyecek olmasıdır.
İ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ı { 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 $null
, bu her zaman iyi bir çözüm değildir.
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 $sort
deterministik 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.
Daha fazla oku:
Kaynak: habr.com