MySQL ve MongoDB: Projeniz İçin Doğru Veritabanını Seçme
MySQL ve MongoDB'nin artılarını, eksilerini ve gerçek dünya örneklerini öğrenin. Şema tasarımı, performans ve ölçeklemeyi karşılaştırarak projeniz için en iyi veritabanını seçin.
Doğru veritabanı teknolojisini seçmek, herhangi bir geliştirme projesi için kritik bir karardır. MySQL ve MongoDB iki önde gelen seçeneği temsil eder. MySQL, ACID garantileriyle yapılandırılmış, ilişkisel bir model sunarken, MongoDB esnek, belge odaklı bir mimari sağlar.
Bu rehberde, bu yöntemleri karşılaştırıp farklılıklarını ortaya koyacak ve her platform için gerçek dünya veri modelleme örnekleri sunacağız. Güçlü ve zayıf yönlerini değerlendirerek uygulamanızın veri gereksinimleri, performans hedefleri ve ölçeklenebilirlik amaçlarıyla en iyi uyum sağlayan veritabanını seçebileceksiniz.
Veri farklı biçimlerde gelir. Yapılandırılmış veri, net ilişkilerle önceden tanımlanmış kategorilere düzgünce oturur; yapılandırılmamış veri ise daha serbest formdadır. İlişkisel veritabanları, verileri sabit şemalara sahip tablolarda saklar; bu şemalar, verinin nasıl eklenip değiştirilebileceğine dair kurallar uygular. Belge odaklı veritabanları ise her kaydı, diğer belgelerle birebir aynı alanlara sahip olması gerekmeyen, kendi içinde bir "belge" olarak kaydeder.
Yapılandırılmış tablolar vs esnek belgeler
Her veritabanının bilgiyi nasıl düzenlediğini açalım; MySQL’in katı, tablo tabanlı şemaları ile MongoDB’nin şemasız belgelerini karşılaştırarak bu farkın gerçek dünya uygulamaları için neden önemli olduğunu inceleyelim.
MySQL ile yapılandırılmış veri
Veritabanlarını sorgulamak ve yönetmek için standart dil Structured Query Language (SQL). MySQL, tam veritabanı desteği sağlayan bir ilişkisel veritabanı yönetim sistemidir (RDBMS): kullanıcı kimlik doğrulaması ve erişim kontrolleri, saklı yordamlar ve kısıtlamalar yoluyla veri bütünlüğü. Birçok başka RDBMS gibi, verilerini sorgulamak için SQL kullanır. MySQL’in diğer ilişkisel veritabanı yönetim sistemleriyle karşılaştırmaları için şu bağlantılara göz atın:
MySQL verileri, elektronik tablolara benzer şekilde tablolarda tutar. Her tablo, belirli veri türlerine (sayılar, kelimeler veya tarihler) sahip alanlar için adlandırılmış sütunları tanımlar ve tek tek kayıtları temsil etmek için satırları kullanır. Her satır, hızlı arama için birincil anahtar adı verilen benzersiz bir kimliğe sahiptir. Bir sütun, ilgili verileri bağlamak için başka bir tablodaki birincil anahtarı işaret eden bir yabancı anahtar olabilir; örneğin bir öğrencinin kaydını notlarına bağlamak gibi.
Bir tabloyu kullanmadan önce, CREATE TABLE gibi komutlarla yapısını ve kurallarını tanımlamanız gerekir. Örneğin “bu sütun boş olamaz” veya “değerler benzersiz olmalıdır” şeklinde belirtebilirsiniz. Veriyi almak veya değiştirmek için SELECT ve INSERT gibi SQL deyimlerini kullanırsınız. MySQL’in sorgu motoru en hızlı yürütme planını belirler.
MongoDB, geleneksel tablo tabanlı ilişkisel modele dayanmayan bir NoSQL veritabanı örneğidir. MongoDB, bilgileri tablolar yerine “belgeler” içinde saklar. Bir belge, her türlü alan karışımını içerebilen JSON benzeri bir nesnedir. Benzer belgeler bir “koleksiyon” içinde gruplandırılır.
Belgeler esnektir ve şemaları yoktur. Bu, bir koleksiyondaki farklı belgelerdeki alanların birebir aynı olmak zorunda olmadığı anlamına gelir. Örneğin bir belgede maidenName alanı bulunabilirken bir diğerinde bulunmayabilir.
Bu şemasız yaklaşım, geliştiricilerin veritabanını yeniden tasarlamadan alanları anında ekleyip kaldırmasına olanak tanır. Arka planda MongoDB bu belgeleri yine de indeksler ve verimli bir şekilde arar. Ayrıca geliştiricilerin, uygulamaları büyüdükçe veri modellerini değiştirmelerine imkân verir.
MongoDB hakkında daha fazla bilgi için şu DataCamp kaynaklarına göz atın.
İlişkisel veritabanları, veriniz sabit sütunlara ve net ilişkilere sahip tablolara uyduğunda mükemmeldir. Örneğin bir okul, öğrenci profillerini ve notlarını bağlantılı tablolarda yönetebilir; bankalar hesapları, işlemleri ve müşteri ayrıntılarını bağlayabilir. Tablolar önceden tanımlandığından, hataları önlemek ve veriyi güvenilir tutmak için kurallar uygulanır.
Belge odaklı veritabanları, veri çeşitli veya evrimleşmekte olduğunda uygundur. Örneğin bir blog platformunda her gönderi için farklı özellikler olabilir. Her belge; yazarlar, etiketler, yorumlar ya da hatta videolar veya anketler gibi bileşenlerin bir kombinasyonunu içerebilir. Yeni özellikler eklerken şemayı yeniden tasarlamaya gerek yoktur.
Şema göçlerinin karmaşıklığı
MySQL’de şema değişiklikleri, SQL geçiş betiklerinin (ALTER TABLE, CREATE TABLE) yazılıp çalıştırılmasını gerektirir. Tablo kilitlerini veya kesintileri önlemek ve bir sorun olursa geri almaları yönetmek için dikkatli planlama ve test gerekir.
MongoDB’nin şemasız modeli, değiştirilecek sabit bir yapı olmadığı anlamına gelir. Bunun yerine, geçişler her belgeyi tarayan ve güncellemeleri uygulayan (örneğin $set, $rename veya $unset operatörleriyle) betikler yazmayı içerir. Belgeler farklı olabileceğinden, veri kaybını veya bozulmayı önlemek için geçişlerin kapsamlı şekilde test edilmesi gerekir.
MongoDB ve MySQL’de Sorgu Dilleri ve Operasyonel Yetenekler
Bu bölümde MySQL ve MongoDB’nin sorgu dillerini karşılaştırıyoruz. Her birini pratik örneklerle gösteriyor ve okuma-yazma performansına dair hususlara değiniyoruz.
MySQL vs MQL: Veri alma yaklaşımlarında farklılıklar
MySQL sabit tablolar ve ilişkilerle çalışır. Bu tablolar ve ilişkileri kullanarak birleştirme, filtreleme ve özetleme için zengin bir sorgu komutları seti sunar.
Tablolar JOIN ile bağlanır, WHERE ile filtrelenir ve ORDER BY ile sıralanır. Veriler, grubu tanımlamak için GROUP BY ile gruplanabilir ve AVG() veya COUNT() gibi komutlarla bu gruplar içinde toplanabilir.
Pencere fonksiyonları, sonuç kümesini daraltmadan satır başına sıralamalar atamak için kullanılır. Örneğin, satır başına sıralamalar RANK() OVER (ORDER BY score) DESC)) ile atanabilir.
MongoDB’nin sorgu dili (MQL), katı tablolar yerine koleksiyonlardaki JSON benzeri belgeler üzerinde çalışır. Kayıtları find() ile alır, karşılaştırma operatörleriyle ($gt, $and, $or) filtreler, yalnızca ihtiyaç duyduğunuz alanları projekte eder ve .sort(), .limit() ve .skip() ile sıralayıp sayfalandırırsınız.
Koleksiyonlar arası birleştirmeler için $lookup kullanın ve çok adımlı iş akışlarında belgeleri dönüştürmek ve birleştirmek için toplama hattı aşamalarından ($match, $group, $sort, $lookup) yararlanın.
Farkları örneklerle gösterelim. Önce, öğrenciler ve notlarının bulunduğu bir tablomuz olduğunu varsayalım. En yüksekten en düşüğe doğru en iyi notları listeleyelim.
MySQL’de bu işlem şöyle görünebilir:
SELECT name, grade
FROM students
WHERE grade >90ORDERBY grade DESC;Altyapı:
MQL’de benzer bir sorguyu şöyle yazarsınız.
db.students.find({grade:{$gt:90}},{name:1,grade:1}) # only project name and grade
.sort({grade:-1})Altyapı:
Her yaklaşım, güçlü veri alma işlemleri için kendi temel modelinden yararlanır: SQL için tablolar, MQL için belgeler.
Performans karşılaştırmaları
MongoDB, katı bir şemayı doğrulamadan tüm belgeleri yazdığı için genellikle MySQL’den daha hızlı yazma performansı sunar. MongoDB şema doğrulaması veya benzersiz indeksler kullandığında bile, belgenin tamamını tek seferde yazdığı için basit eklemelerde genellikle daha hızlıdır.
Okuma performansı kullanım durumuna göre değişir. Belge merkezli modeli sayesinde MongoDB, tekil belgeleri veya küçük partileri kimliğe göre getirmede üstündür. MySQL ise maliyet tabanlı eniyileştiricisi ve olgun indeksleme stratejileri sayesinde karmaşık çok tablolu birleştirmeler veya büyük toplamlarda üstündür.
MySQL ve MongoDB Ölçeklenebilirlik Stratejileri
İki zıt ölçekleme stratejisi vardır: dikey ve yatay. Dikey ölçekleme, artan yükü karşılamak için tek bir makineye daha fazla CPU, RAM veya daha hızlı sürücüler eklemeyi içerir.
Bu yaklaşım, küme veya yük dengeleyicilere ihtiyaç duymadığı için basittir. Ancak donanım sınırlarına bağlıdır ve pahalı olabilir. Tek bir hata noktası vardır: Sunucu çökerse her şey durur.
Buna karşılık yatay ölçekleme, iş yükünü paylaşmak için daha fazla makine eklemek anlamına gelir. Uygun maliyetle büyümenize yardımcı olur (devasa, pahalı bir sunucuya gerek yoktur) ve bir makine arızalansa bile operasyonların sürmesini sağlar. Ancak daha fazla koordinasyon (yük dengeleme ve veri eşzamanlama gibi) gerektirdiği için daha fazla ağ ek yükü yaratabilir.
MySQL’in dikey ölçekleme sınırlamaları
MySQL için dikey ölçekleme iki adım içerir: önce donanımı yükseltin, ardından bu yeni kaynakları verimli kullanmak için yapılandırma ayarlarını iyileştirin. Donanım tarafında daha fazla CPU çekirdeği ekleyebilir, RAM’i genişletebilir ve daha hızlı depolama ile ağ bileşenleri kullanabilirsiniz. Makine yeterince güçlü olduğunda şu yapılandırma ayarlarını kullanın:
innodb_buffer_pool_size. Belleği RAM’inizle uyumlu olacak şekilde artırın.
innodb_log_file_size, innodb_log_buffer_size: Daha fazla yazma işlemini biriktirmek için bunları artırın.
max_connections, table_open_cache, thread_cache_size. Bunları artırarak daha fazla istemciyi ve tabloyu bellekte “sıcak” tutun.
Ancak dikey ölçeklemenin pratik sınırları vardır. Bir noktada tek bir makine CPU çekirdeği veya bellek sınırına ulaşacaktır. Donanım yatırımı için azalan getiri noktası vardır; örneğin CPU çekirdeklerine ödediğiniz fiyatı ikiye katlamak her zaman CPU gücünü ikiye katlamaz.
Yazma ağırlıklı iş yükleri, kilitli satırlar veya indekslerle ilgili sorunlarla karşılaşabilir. Sunucunun arızalanması tüm veritabanını çevrimdışı bırakabilir.
MySQL yatay teknikleri kullanabilir ve kullanır, ancak bu, MongoDB’nin yerleşik parçalama modeline kıyasla ek yapılandırma gerektirir.
MongoDB’nin parçalama yoluyla yatay ölçeklemesi
MongoDB, “parçalama” olarak adlandırılan yatay bir ölçekleme stratejisi kullanır; bu strateji, büyük bir koleksiyonu bir “parça anahtarı”na (örneğin, belge kimlikleri aralıkları) göre daha küçük parçalara böler. Her parça farklı bir sunucuda saklanır.
Bir yapılandırma sunucuları grubu, hangi parçaların hangi dilimleri içerdiğine dair bir harita tutar. Sorgu yönlendiricileri, istemci isteklerini uygun parçalara göndermek için bu dizini kullanır. Otomatik bir dengeleyici, veri ve trafik kalıpları değiştikçe dilimleri yeniden dağıtarak hiçbir parçanın aşırı yüklenmemesini sağlar. Kapasiteyi artırmak için daha fazla parça sunucusu ekleyin.
Bu yaklaşım, sosyal medya, video akışı ve büyük indirim dönemlerindeki e-ticaret gibi öngörülemeyen veya çok büyük yükleri olan uygulamalar için idealdir. Depolama ve sorgu yükleri birçok makineye dağıtıldığı için trafik arttığında sistem duyarlı ve dayanıklı kalır.
Güvenlik ve Uyumluluk Hususları
Verilerin güvenli kalmasını ve sektör düzenlemelerine uyumlu olmasını sağlamak, her veritabanı dağıtımı için kritiktir. Kimlik doğrulama, şifreleme ve HIPAA ile GDPR gibi standartlara destek açısından MySQL ve MongoDB’yi karşılaştıralım.
Kimlik doğrulama ve şifreleme
MySQL
MySQL, kullanıcı kimlik doğrulaması, şifreli bağlantılar ve disk düzeyinde şifrelemenin birleşimiyle verileri güvence altına alır. Her kullanıcı, benzersiz bir hesap ve parolayla oturum açmak zorundadır ve bireysel veya role dayalı olarak yalnızca gereken yetkiler verilir. Aktarım halindeki tüm veriler TLS/SSL ile korunabilir, yalnızca SSL’e zorlanabilir ve sunucu sertifikalarıyla doğrulanabilir. Durağan veriler InnoDB motoru tarafından şifrelenir. Şifreleme anahtarları kesinti olmadan sorunsuzca döndürülebilir.
MongoDB
MongoDB verileri kimlik doğrulama, şifreleme ve denetimle korur. Her kullanıcı, benzersiz bir kullanıcı adı ve parolayla (SCRAM, x.509 sertifikaları, Kerberos veya LDAP üzerinden) oturum açar ve yerleşik veya özel roller yoluyla yetkilendirilir. Aktarım halindeki trafik TLS/SSL ile korunur ve durağan veriler WiredTiger depolama motoruyla korunur. Ayrıntılı denetim günlükleri, güvenlik incelemeleri ve uyumluluğu desteklemek için oturum açma girişimlerini ve veri değişikliklerini kaydeder.
Uyumluluk
ABD’de tıbbi kayıtları koruyan yasa HIPAA, sıkı erişim kontrolleri, aktarım ve durağan halde şifreleme ile kapsamlı denetim gerektirir. MySQL, role dayalı kullanıcı hesapları, aktarım halindeki veri için TLS/SSL, durağan veri için InnoDB Şeffaf Veri Şifreleme ve her erişimi kaydeden denetim eklentileriyle bu gereksinimleri karşılar.
MongoDB, SCRAM veya x.509 kimlik doğrulaması, TLS/SSL, WiredTiger depolama şifrelemesi, Kurumsal denetim günlüğü ve isteğe bağlı istemci tarafı alan düzeyinde şifreleme kullanarak aynı standartları karşılar.
GDPR, AB sakinlerine kişisel verilerine erişme, düzeltme ve silme hakkı tanır ve sıkı erişim kontrolleri, şifreleme ve denetlenebilirlik zorunlu kılar.
MySQL, role dayalı ayrıcalıklar, güvenli bağlantılar için TLS/SSL, InnoDB Şeffaf Veri Şifreleme, değişiklikleri izlemek için denetim eklentileri ve silmeleri zorlamak için yabancı anahtar basamaklarıyla bu gereksinimleri destekler.
MongoDB, SCRAM/x.509 kimlik doğrulaması, TLS/SSL, WiredTiger durağan şifreleme, Kurumsal denetim günlüğü, esnek belge düzeyinde güncellemeler ve silmeler ve veri yerleşimi için bölgeye özel dağıtım seçenekleriyle GDPR standartlarını karşılar.
MySQL ve MongoDB Artıları ve Eksileri Karşılaştırma Tablosu
Boyut
MySQL (İlişkisel)
MongoDB (Belge Odaklı)
Veri Paradigması
Sabit şemalı yapılandırılmış veri.
Esnek şemalı yapılandırılmamış veya yarı yapılandırılmış veri.
Depolama Modeli
Satır ve sütunlardan oluşan tablolar.
Koleksiyonlarda saklanan JSON benzeri belgeler.
Şema Tanımı
Açık. CREATE TABLE ile en başta tanımlanır; sütunların veri türleri ve kısıtları vardır (NOT NULL, UNIQUE, yabancı anahtarlar).
Örtük. Belgeler herhangi bir alanı içerebilir. Önceden tanım gerekmez.
İlişkiler
Tablolar arasında yabancı anahtar kısıtlarıyla zorlanır.
İlgili verileri tek bir belgede gömerek veya diğer belgelere referans vererek sağlanır.
Esneklik
Katı. Sütun eklemek veya değiştirmek ALTER TABLE geçişleri ve dikkatli planlama gerektirir.
Esnek. Alanlar kesinti olmadan anında eklenip kaldırılabilir.
Şema Geçişi
Betikler (ALTER TABLE, CREATE TABLE), olası tablo kilitleri, test ve geri alma planlaması.
Belge düzeyinde $set, $rename, $unset kullanan güncelleme betikleri; tipik olarak idempotent ve arka planda çalıştırılabilir.
İndeksleme & Sorgular
Çok tablolu JOIN’lar ve toplamlara optimize edilmiştir.
Belge alanları ve alt alanları üzerinde indeksler. Toplama hatları, gruplama, filtreleme ve $lookup birleştirmelerini destekler.
Kullanım Senaryosu Analizi: Doğru Aracı Seçme
Doğru veritabanını seçmek, uygulamanızın iş yüküne, veri modeline ve büyüme kalıplarına bağlıdır. MySQL ve MongoDB’nin en yüksek değeri sunduğu senaryoları karşılaştıralım.
MySQL için ideal senaryolar
MySQL, güvenilir, yüksek hacimli işlem işleme ve iyi yapılandırılmış verinin gerekli olduğu uygulamalarda mükemmeldir.
Finans kuruluşları hesap transferlerini ve bakiye güncellemelerini kaydetmek için MySQL kullanır; e-ticaret platformları siparişleri, envanteri ve müşteri bilgilerini yönetir. Sağlık sistemleri hasta kayıtları ve randevu verilerini saklar ve büyük işletmeler satış, faturalama ve destek süreçlerini birbirine bağlayan ERP veya CRM sistemlerini çalıştırır.
MySQL’in zengin özellik seti (GROUP BY, JOIN’lar, pencere fonksiyonları ve indeksli aramalar), aylık satış toplamları veya ortalama yanıt süreleri gibi yapılandırılmış raporlar oluşturmayı ve BI araçlarıyla kolay bağlanmayı sağlar.
Modern uygulamalarda MongoDB’nin güçlü yönleri
MongoDB’nin şemasız tasarımı ve yatay ölçeklemesi, hızla evrilmesi gereken veya devasa veri kümelerini işleyen uygulamalar için idealdir. Yeni özellikler, maliyetli şema geçişleri olmadan eklenebilir.
Küresel hizmetler, okuma ve yazmaları hızlı ve dayanıklı tutmak için verileri bölgeler arasında parçalar. Yüksek hacimli gerçek zamanlı olay akışlarını işleyebilmesi, reklam teknolojisi platformları gibi saniyede milyonlarca gösterimi işleyen kullanım durumları için uygundur.
MongoDB’nin esnek belge modeli, içerik yönetimiyle iyi çalışır; makalelerin ve kullanıcı yorumlarının kendilerine özgü meta veri kombinasyonlarıyla, katı tablolara gerek kalmadan birlikte yaşamasına imkân verir. Pazarlama sistemleri bu esnekliği A/B test parametrelerini, izleme etiketlerini ve kişiselleştirme kurallarını saklamak için kullanabilir.
MongoDB’nin yatay mimarisi, IoT veya oyun arka uçlarında görülenler gibi devasa ve öngörülemeyen iş yüklerinin, sistemi duyarlı ve hataya dayanıklı tutmak için birçok sunucuya yayılmasını sağlar.
Geçiş Stratejileri ve Araçlar
MySQL ilişkisel bir model kullanırken, MongoDB belge tabanlı bir model kullanır. Bu nedenle MySQL’den MongoDB’ye geçiş, hem veri yapılarını hem de uygulama mantığını yeniden düşünmek için dikkatli planlama gerektirir.
MySQL şemasını analiz edin. MySQL tablolarını; sütunlar, veri türleri ve yabancı anahtar ilişkileri dâhil envanterleyerek MongoDB’de modellemeniz gereken mantıksal varlıkları ve bağlantıları belirleyin.
Belge modelini tasarlayın. Üst düzey koleksiyonları seçin ve hangi ilgili verileri gömeceğinize, hangilerine referans vereceğinize karar verin. İndeksleri belirleyin ve parçalama yapacaksanız uygun bir parça anahtarı seçin.
Veriyi çıkarın. MySQL tablolarını JSON veya CSV olarak dışa aktarın (mysqldump veya ETL betikleri kullanarak); gerektiğinde büyük tabloları yönetilebilir partilere bölün.
Veriyi dönüştürün ve temizleyin. Her satırı hedef belge yapısına uyacak şekilde yeniden şekillendirin. Gömülü belgeler için ebeveyn ve çocuk satırları birleştirin, referanslar için kimlikleri koruyun. NULL değerleri ve tür dönüşümlerini yönetin.
Veriyi MongoDB’ye yükleyin. Belgeleri eklemek için mongoimport veya özel betikler kullanın. Ardından gerekli indeksleri oluşturun.
Uygulama kodunu yeniden düzenleyin. SQL sorgularını MongoDB çağrılarıyla (ör. find(), insertOne() ve toplama hatları) değiştirin. Gerekirse işlem mantığını güncelleyin.
Test edin ve doğrulayın. Tüm oluşturma, okuma, güncelleme ve silme işlemlerinin aynı şekilde davrandığını doğrulayın. Performansı ve veri bütünlüğünü doğrulamak için tümleşik ve yük testleri çalıştırın.
Dağıtın. MongoDB sürümünüzü aşamada MySQL’in yanında dağıtın, performansı izleyin; ardından üretim trafiğini MongoDB’ye yönlendirin ve geçişin başarıldığından emin olduğunuzda MySQL’i devre dışı bırakın.
Sonuç
MySQL ile MongoDB arasındaki seçim, uygulamanızın veriyi nasıl ele aldığına bağlıdır. MySQL’in sabit, tablo tabanlı şeması, ACID uyumluluğu, olgun SQL sorgulaması ve dikey ölçeklemesi; bankacılık veya e-ticaret gibi işlem ağırlıklı, yapılandırılmış raporlama senaryoları için idealdir.
MongoDB’nin şemasız belge modeli, esnek toplama hatları ve yerleşik yatay parçalama; gerçek zamanlı analiz, IoT telemetrisi ve içerik yönetimi gibi hızla evrilen, yüksek hacimli veya coğrafi olarak dağıtık kullanım durumlarında öne çıkar. İşlem güvenilirliği, şema esnekliği, sorgu karmaşıklığı ve ölçekleme stratejisi gibi faktörleri değerlendirerek, ekipler performans ve büyüme ihtiyaçlarıyla en iyi uyum sağlayan veritabanını seçebilir.
MySQL, verileri önceden tanımlanmış şemalara sahip sabit tablolarda saklayan ilişkisel bir veritabanıdır; MongoDB ise katı bir şema gerektirmeden esnek, JSON benzeri belgeler saklayan belge odaklı bir veritabanıdır.
Ne zaman MySQL’i MongoDB’ye tercih etmeliyim?⌄
İyi yapılandırılmış veri, karmaşık birleştirmeler ve sıkı veri bütünlüğü gereksinimleri olan, işlem ağırlıklı uygulamalar için (örneğin bankacılık sistemleri ve e-ticaret sipariş işlemleri) MySQL kullanın.
Hızlı şema evrimi gereken, büyük hacimli yarı yapılandırılmış veriyi işleyen veya yatay ölçeklenebilirliğe ihtiyaç duyan projelerde MongoDB kullanın. Örnekler: gerçek zamanlı analiz, içerik yönetimi ve IoT telemetrisi.
ACID uyumluluğu ne anlama gelir ve hangi veritabanı bunu destekler?⌄
ACID, Atomiklik, Tutarlılık, Yalıtım ve Kalıcılık anlamına gelir. MySQL varsayılan olarak tam ACID uyumludur. MongoDB, belge düzeyinde ACID işlemlerini ve son sürümlerde çok belgeli işlemleri destekler; ancak temel gücü esnek, sonunda tutarlı ölçeklemedir.
MySQL ve MongoDB güvenlik ve uyumluluğu nasıl ele alır?⌄
Her ikisi de rol tabanlı erişim kontrolünü, aktarımda TLS/SSL şifrelemeyi ve durağan halde şifrelemeyi (MySQL’de InnoDB TDE; MongoDB’de WiredTiger şifreleme) destekler. Her biri HIPAA ve GDPR gibi standartları karşılamak için denetim günlüğü ve entegrasyonlar sunar.
MySQL ve MongoDB birlikte kullanılabilir mi?⌄
Evet, birçok mimari ikisini bir arada kullanır; MySQL işlemsel, yapılandırılmış veriyi yönetirken, MongoDB esnek, yüksek hacimli veya coğrafi olarak dağıtık iş yüklerini yönetir; her biri kendi güçlü yönlerine göre rol alır.
Mark Pedigo, PhD, sağlık verisi bilimi, programlama ve eğitim alanlarında uzmanlığa sahip seçkin bir veri bilimcisidir. Matematikte doktora, Bilgisayar Biliminde lisans ve Yapay Zekâ alanında Profesyonel Sertifika sahibi olan Mark, teknik bilgisini pratik problem çözme becerileriyle birleştirir. Kariyeri, dolandırıcılık tespiti, bebek ölümü tahmini ve finansal öngörü gibi rollerin yanı sıra NASA’nın maliyet tahmin yazılımına katkıları içerir. Bir eğitimci olarak DataCamp ve St. Louis’teki Washington University’de ders vermiş ve kıdemsiz programcılara mentorluk yapmıştır. Boş zamanlarında Mark, eşi Mandy ve köpeği Harley ile Minnesota’nın doğasında vakit geçirmeyi ve caz piyano çalmayı sever.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Doğru veritabanı teknolojisini seçmek, herhangi bir geliştirme projesi için kritik bir karardır. MySQL ve MongoDB iki önde gelen seçeneği temsil eder. MySQL, ACID garantileriyle yapılandırılmış, ilişkisel bir model sunarken, MongoDB esnek, belge odaklı bir mimari sağlar.
Bu rehberde, bu yöntemleri karşılaştırıp farklılıklarını ortaya koyacak ve her platform için gerçek dünya veri modelleme örnekleri sunacağız. Güçlü ve zayıf yönlerini değerlendirerek uygulamanızın veri gereksinimleri, performans hedefleri ve ölçeklenebilirlik amaçlarıyla en iyi uyum sağlayan veritabanını seçebileceksiniz.
Her iki araca da başlamak istiyorsanız, NoSQL'e Giriş veya Python ile MongoDB'ye Giriş kurslarımıza göz atmayı unutmayın.
MySQL ve MongoDB: Veri Modelleri ve Şema Tasarımı
Veri farklı biçimlerde gelir. Yapılandırılmış veri, net ilişkilerle önceden tanımlanmış kategorilere düzgünce oturur; yapılandırılmamış veri ise daha serbest formdadır. İlişkisel veritabanları, verileri sabit şemalara sahip tablolarda saklar; bu şemalar, verinin nasıl eklenip değiştirilebileceğine dair kurallar uygular. Belge odaklı veritabanları ise her kaydı, diğer belgelerle birebir aynı alanlara sahip olması gerekmeyen, kendi içinde bir "belge" olarak kaydeder.
Yapılandırılmış tablolar vs esnek belgeler
Her veritabanının bilgiyi nasıl düzenlediğini açalım; MySQL’in katı, tablo tabanlı şemaları ile MongoDB’nin şemasız belgelerini karşılaştırarak bu farkın gerçek dünya uygulamaları için neden önemli olduğunu inceleyelim.
MySQL ile yapılandırılmış veri
Veritabanlarını sorgulamak ve yönetmek için standart dil Structured Query Language (SQL). MySQL, tam veritabanı desteği sağlayan bir ilişkisel veritabanı yönetim sistemidir (RDBMS): kullanıcı kimlik doğrulaması ve erişim kontrolleri, saklı yordamlar ve kısıtlamalar yoluyla veri bütünlüğü. Birçok başka RDBMS gibi, verilerini sorgulamak için SQL kullanır. MySQL’in diğer ilişkisel veritabanı yönetim sistemleriyle karşılaştırmaları için şu bağlantılara göz atın:
MySQL verileri, elektronik tablolara benzer şekilde tablolarda tutar. Her tablo, belirli veri türlerine (sayılar, kelimeler veya tarihler) sahip alanlar için adlandırılmış sütunları tanımlar ve tek tek kayıtları temsil etmek için satırları kullanır. Her satır, hızlı arama için birincil anahtar adı verilen benzersiz bir kimliğe sahiptir. Bir sütun, ilgili verileri bağlamak için başka bir tablodaki birincil anahtarı işaret eden bir yabancı anahtar olabilir; örneğin bir öğrencinin kaydını notlarına bağlamak gibi.
Bir tabloyu kullanmadan önce, CREATE TABLE gibi komutlarla yapısını ve kurallarını tanımlamanız gerekir. Örneğin “bu sütun boş olamaz” veya “değerler benzersiz olmalıdır” şeklinde belirtebilirsiniz. Veriyi almak veya değiştirmek için SELECT ve INSERT gibi SQL deyimlerini kullanırsınız. MySQL’in sorgu motoru en hızlı yürütme planını belirler.
Veritabanı tasarımı başlı başına önemli bir bilim ve sanattır.
MongoDB ile yapılandırılmamış veri
MongoDB, geleneksel tablo tabanlı ilişkisel modele dayanmayan bir NoSQL veritabanı örneğidir. MongoDB, bilgileri tablolar yerine “belgeler” içinde saklar. Bir belge, her türlü alan karışımını içerebilen JSON benzeri bir nesnedir. Benzer belgeler bir “koleksiyon” içinde gruplandırılır.
Belgeler esnektir ve şemaları yoktur. Bu, bir koleksiyondaki farklı belgelerdeki alanların birebir aynı olmak zorunda olmadığı anlamına gelir. Örneğin bir belgede
maidenNamealanı bulunabilirken bir diğerinde bulunmayabilir.Bu şemasız yaklaşım, geliştiricilerin veritabanını yeniden tasarlamadan alanları anında ekleyip kaldırmasına olanak tanır. Arka planda MongoDB bu belgeleri yine de indeksler ve verimli bir şekilde arar. Ayrıca geliştiricilerin, uygulamaları büyüdükçe veri modellerini değiştirmelerine imkân verir.
MongoDB hakkında daha fazla bilgi için şu DataCamp kaynaklarına göz atın.
İlişkisel vs belge odaklı veritabanları
İlişkisel veritabanları, veriniz sabit sütunlara ve net ilişkilere sahip tablolara uyduğunda mükemmeldir. Örneğin bir okul, öğrenci profillerini ve notlarını bağlantılı tablolarda yönetebilir; bankalar hesapları, işlemleri ve müşteri ayrıntılarını bağlayabilir. Tablolar önceden tanımlandığından, hataları önlemek ve veriyi güvenilir tutmak için kurallar uygulanır.
Belge odaklı veritabanları, veri çeşitli veya evrimleşmekte olduğunda uygundur. Örneğin bir blog platformunda her gönderi için farklı özellikler olabilir. Her belge; yazarlar, etiketler, yorumlar ya da hatta videolar veya anketler gibi bileşenlerin bir kombinasyonunu içerebilir. Yeni özellikler eklerken şemayı yeniden tasarlamaya gerek yoktur.
Şema göçlerinin karmaşıklığı
MySQL’de şema değişiklikleri, SQL geçiş betiklerinin (ALTER TABLE, CREATE TABLE) yazılıp çalıştırılmasını gerektirir. Tablo kilitlerini veya kesintileri önlemek ve bir sorun olursa geri almaları yönetmek için dikkatli planlama ve test gerekir.
MongoDB’nin şemasız modeli, değiştirilecek sabit bir yapı olmadığı anlamına gelir. Bunun yerine, geçişler her belgeyi tarayan ve güncellemeleri uygulayan (örneğin $set, $rename veya $unset operatörleriyle) betikler yazmayı içerir. Belgeler farklı olabileceğinden, veri kaybını veya bozulmayı önlemek için geçişlerin kapsamlı şekilde test edilmesi gerekir.
MongoDB ve MySQL’de Sorgu Dilleri ve Operasyonel Yetenekler
Bu bölümde MySQL ve MongoDB’nin sorgu dillerini karşılaştırıyoruz. Her birini pratik örneklerle gösteriyor ve okuma-yazma performansına dair hususlara değiniyoruz.
MySQL vs MQL: Veri alma yaklaşımlarında farklılıklar
MySQL sabit tablolar ve ilişkilerle çalışır. Bu tablolar ve ilişkileri kullanarak birleştirme, filtreleme ve özetleme için zengin bir sorgu komutları seti sunar.
Tablolar
JOINile bağlanır,WHEREile filtrelenir veORDER BYile sıralanır. Veriler, grubu tanımlamak içinGROUP BYile gruplanabilir veAVG()veyaCOUNT()gibi komutlarla bu gruplar içinde toplanabilir.Pencere fonksiyonları, sonuç kümesini daraltmadan satır başına sıralamalar atamak için kullanılır. Örneğin, satır başına sıralamalar
RANK() OVER (ORDER BY score) DESC))ile atanabilir.MongoDB’nin sorgu dili (MQL), katı tablolar yerine koleksiyonlardaki JSON benzeri belgeler üzerinde çalışır. Kayıtları
find()ile alır, karşılaştırma operatörleriyle ($gt,$and,$or) filtreler, yalnızca ihtiyaç duyduğunuz alanları projekte eder ve.sort(),.limit()ve.skip()ile sıralayıp sayfalandırırsınız.Koleksiyonlar arası birleştirmeler için
$lookupkullanın ve çok adımlı iş akışlarında belgeleri dönüştürmek ve birleştirmek için toplama hattı aşamalarından ($match,$group,$sort,$lookup) yararlanın.Farkları örneklerle gösterelim. Önce, öğrenciler ve notlarının bulunduğu bir tablomuz olduğunu varsayalım. En yüksekten en düşüğe doğru en iyi notları listeleyelim.
MySQL’de bu işlem şöyle görünebilir:
MQL’de benzer bir sorguyu şöyle yazarsınız.
Her yaklaşım, güçlü veri alma işlemleri için kendi temel modelinden yararlanır: SQL için tablolar, MQL için belgeler.
Performans karşılaştırmaları
MongoDB, katı bir şemayı doğrulamadan tüm belgeleri yazdığı için genellikle MySQL’den daha hızlı yazma performansı sunar. MongoDB şema doğrulaması veya benzersiz indeksler kullandığında bile, belgenin tamamını tek seferde yazdığı için basit eklemelerde genellikle daha hızlıdır.
Okuma performansı kullanım durumuna göre değişir. Belge merkezli modeli sayesinde MongoDB, tekil belgeleri veya küçük partileri kimliğe göre getirmede üstündür. MySQL ise maliyet tabanlı eniyileştiricisi ve olgun indeksleme stratejileri sayesinde karmaşık çok tablolu birleştirmeler veya büyük toplamlarda üstündür.
MySQL ve MongoDB Ölçeklenebilirlik Stratejileri
İki zıt ölçekleme stratejisi vardır: dikey ve yatay. Dikey ölçekleme, artan yükü karşılamak için tek bir makineye daha fazla CPU, RAM veya daha hızlı sürücüler eklemeyi içerir.
Bu yaklaşım, küme veya yük dengeleyicilere ihtiyaç duymadığı için basittir. Ancak donanım sınırlarına bağlıdır ve pahalı olabilir. Tek bir hata noktası vardır: Sunucu çökerse her şey durur.
Buna karşılık yatay ölçekleme, iş yükünü paylaşmak için daha fazla makine eklemek anlamına gelir. Uygun maliyetle büyümenize yardımcı olur (devasa, pahalı bir sunucuya gerek yoktur) ve bir makine arızalansa bile operasyonların sürmesini sağlar. Ancak daha fazla koordinasyon (yük dengeleme ve veri eşzamanlama gibi) gerektirdiği için daha fazla ağ ek yükü yaratabilir.
MySQL’in dikey ölçekleme sınırlamaları
MySQL için dikey ölçekleme iki adım içerir: önce donanımı yükseltin, ardından bu yeni kaynakları verimli kullanmak için yapılandırma ayarlarını iyileştirin. Donanım tarafında daha fazla CPU çekirdeği ekleyebilir, RAM’i genişletebilir ve daha hızlı depolama ile ağ bileşenleri kullanabilirsiniz. Makine yeterince güçlü olduğunda şu yapılandırma ayarlarını kullanın:
innodb_buffer_pool_size. Belleği RAM’inizle uyumlu olacak şekilde artırın.innodb_log_file_size,innodb_log_buffer_size: Daha fazla yazma işlemini biriktirmek için bunları artırın.max_connections,table_open_cache, thread_cache_size. Bunları artırarak daha fazla istemciyi ve tabloyu bellekte “sıcak” tutun.Ancak dikey ölçeklemenin pratik sınırları vardır. Bir noktada tek bir makine CPU çekirdeği veya bellek sınırına ulaşacaktır. Donanım yatırımı için azalan getiri noktası vardır; örneğin CPU çekirdeklerine ödediğiniz fiyatı ikiye katlamak her zaman CPU gücünü ikiye katlamaz.
Yazma ağırlıklı iş yükleri, kilitli satırlar veya indekslerle ilgili sorunlarla karşılaşabilir. Sunucunun arızalanması tüm veritabanını çevrimdışı bırakabilir.
MySQL yatay teknikleri kullanabilir ve kullanır, ancak bu, MongoDB’nin yerleşik parçalama modeline kıyasla ek yapılandırma gerektirir.
MongoDB’nin parçalama yoluyla yatay ölçeklemesi
MongoDB, “parçalama” olarak adlandırılan yatay bir ölçekleme stratejisi kullanır; bu strateji, büyük bir koleksiyonu bir “parça anahtarı”na (örneğin, belge kimlikleri aralıkları) göre daha küçük parçalara böler. Her parça farklı bir sunucuda saklanır.
Bir yapılandırma sunucuları grubu, hangi parçaların hangi dilimleri içerdiğine dair bir harita tutar. Sorgu yönlendiricileri, istemci isteklerini uygun parçalara göndermek için bu dizini kullanır. Otomatik bir dengeleyici, veri ve trafik kalıpları değiştikçe dilimleri yeniden dağıtarak hiçbir parçanın aşırı yüklenmemesini sağlar. Kapasiteyi artırmak için daha fazla parça sunucusu ekleyin.
Bu yaklaşım, sosyal medya, video akışı ve büyük indirim dönemlerindeki e-ticaret gibi öngörülemeyen veya çok büyük yükleri olan uygulamalar için idealdir. Depolama ve sorgu yükleri birçok makineye dağıtıldığı için trafik arttığında sistem duyarlı ve dayanıklı kalır.
Güvenlik ve Uyumluluk Hususları
Verilerin güvenli kalmasını ve sektör düzenlemelerine uyumlu olmasını sağlamak, her veritabanı dağıtımı için kritiktir. Kimlik doğrulama, şifreleme ve HIPAA ile GDPR gibi standartlara destek açısından MySQL ve MongoDB’yi karşılaştıralım.
Kimlik doğrulama ve şifreleme
MySQL
MySQL, kullanıcı kimlik doğrulaması, şifreli bağlantılar ve disk düzeyinde şifrelemenin birleşimiyle verileri güvence altına alır. Her kullanıcı, benzersiz bir hesap ve parolayla oturum açmak zorundadır ve bireysel veya role dayalı olarak yalnızca gereken yetkiler verilir. Aktarım halindeki tüm veriler TLS/SSL ile korunabilir, yalnızca SSL’e zorlanabilir ve sunucu sertifikalarıyla doğrulanabilir. Durağan veriler InnoDB motoru tarafından şifrelenir. Şifreleme anahtarları kesinti olmadan sorunsuzca döndürülebilir.
MongoDB
MongoDB verileri kimlik doğrulama, şifreleme ve denetimle korur. Her kullanıcı, benzersiz bir kullanıcı adı ve parolayla (SCRAM, x.509 sertifikaları, Kerberos veya LDAP üzerinden) oturum açar ve yerleşik veya özel roller yoluyla yetkilendirilir. Aktarım halindeki trafik TLS/SSL ile korunur ve durağan veriler WiredTiger depolama motoruyla korunur. Ayrıntılı denetim günlükleri, güvenlik incelemeleri ve uyumluluğu desteklemek için oturum açma girişimlerini ve veri değişikliklerini kaydeder.
Uyumluluk
ABD’de tıbbi kayıtları koruyan yasa HIPAA, sıkı erişim kontrolleri, aktarım ve durağan halde şifreleme ile kapsamlı denetim gerektirir. MySQL, role dayalı kullanıcı hesapları, aktarım halindeki veri için TLS/SSL, durağan veri için InnoDB Şeffaf Veri Şifreleme ve her erişimi kaydeden denetim eklentileriyle bu gereksinimleri karşılar.
MongoDB, SCRAM veya x.509 kimlik doğrulaması, TLS/SSL, WiredTiger depolama şifrelemesi, Kurumsal denetim günlüğü ve isteğe bağlı istemci tarafı alan düzeyinde şifreleme kullanarak aynı standartları karşılar.
GDPR, AB sakinlerine kişisel verilerine erişme, düzeltme ve silme hakkı tanır ve sıkı erişim kontrolleri, şifreleme ve denetlenebilirlik zorunlu kılar.
MySQL, role dayalı ayrıcalıklar, güvenli bağlantılar için TLS/SSL, InnoDB Şeffaf Veri Şifreleme, değişiklikleri izlemek için denetim eklentileri ve silmeleri zorlamak için yabancı anahtar basamaklarıyla bu gereksinimleri destekler.
MongoDB, SCRAM/x.509 kimlik doğrulaması, TLS/SSL, WiredTiger durağan şifreleme, Kurumsal denetim günlüğü, esnek belge düzeyinde güncellemeler ve silmeler ve veri yerleşimi için bölgeye özel dağıtım seçenekleriyle GDPR standartlarını karşılar.
MySQL ve MongoDB Artıları ve Eksileri Karşılaştırma Tablosu
Boyut
MySQL (İlişkisel)
MongoDB (Belge Odaklı)
Veri Paradigması
Sabit şemalı yapılandırılmış veri.
Esnek şemalı yapılandırılmamış veya yarı yapılandırılmış veri.
Depolama Modeli
Satır ve sütunlardan oluşan tablolar.
Koleksiyonlarda saklanan JSON benzeri belgeler.
Şema Tanımı
Açık.
CREATE TABLEile en başta tanımlanır; sütunların veri türleri ve kısıtları vardır (NOT NULL,UNIQUE, yabancı anahtarlar).Örtük. Belgeler herhangi bir alanı içerebilir. Önceden tanım gerekmez.
İlişkiler
Tablolar arasında yabancı anahtar kısıtlarıyla zorlanır.
İlgili verileri tek bir belgede gömerek veya diğer belgelere referans vererek sağlanır.
Esneklik
Katı. Sütun eklemek veya değiştirmek
ALTER TABLEgeçişleri ve dikkatli planlama gerektirir.Esnek. Alanlar kesinti olmadan anında eklenip kaldırılabilir.
Şema Geçişi
Betikler (
ALTER TABLE,CREATE TABLE), olası tablo kilitleri, test ve geri alma planlaması.Belge düzeyinde
$set,$rename,$unsetkullanan güncelleme betikleri; tipik olarak idempotent ve arka planda çalıştırılabilir.İndeksleme & Sorgular
Çok tablolu
JOIN’lar ve toplamlara optimize edilmiştir.Belge alanları ve alt alanları üzerinde indeksler. Toplama hatları, gruplama, filtreleme ve
$lookupbirleştirmelerini destekler.Kullanım Senaryosu Analizi: Doğru Aracı Seçme
Doğru veritabanını seçmek, uygulamanızın iş yüküne, veri modeline ve büyüme kalıplarına bağlıdır. MySQL ve MongoDB’nin en yüksek değeri sunduğu senaryoları karşılaştıralım.
MySQL için ideal senaryolar
MySQL, güvenilir, yüksek hacimli işlem işleme ve iyi yapılandırılmış verinin gerekli olduğu uygulamalarda mükemmeldir.
Finans kuruluşları hesap transferlerini ve bakiye güncellemelerini kaydetmek için MySQL kullanır; e-ticaret platformları siparişleri, envanteri ve müşteri bilgilerini yönetir. Sağlık sistemleri hasta kayıtları ve randevu verilerini saklar ve büyük işletmeler satış, faturalama ve destek süreçlerini birbirine bağlayan ERP veya CRM sistemlerini çalıştırır.
MySQL’in zengin özellik seti (GROUP BY, JOIN’lar, pencere fonksiyonları ve indeksli aramalar), aylık satış toplamları veya ortalama yanıt süreleri gibi yapılandırılmış raporlar oluşturmayı ve BI araçlarıyla kolay bağlanmayı sağlar.
Modern uygulamalarda MongoDB’nin güçlü yönleri
MongoDB’nin şemasız tasarımı ve yatay ölçeklemesi, hızla evrilmesi gereken veya devasa veri kümelerini işleyen uygulamalar için idealdir. Yeni özellikler, maliyetli şema geçişleri olmadan eklenebilir.
Küresel hizmetler, okuma ve yazmaları hızlı ve dayanıklı tutmak için verileri bölgeler arasında parçalar. Yüksek hacimli gerçek zamanlı olay akışlarını işleyebilmesi, reklam teknolojisi platformları gibi saniyede milyonlarca gösterimi işleyen kullanım durumları için uygundur.
MongoDB’nin esnek belge modeli, içerik yönetimiyle iyi çalışır; makalelerin ve kullanıcı yorumlarının kendilerine özgü meta veri kombinasyonlarıyla, katı tablolara gerek kalmadan birlikte yaşamasına imkân verir. Pazarlama sistemleri bu esnekliği A/B test parametrelerini, izleme etiketlerini ve kişiselleştirme kurallarını saklamak için kullanabilir.
MongoDB’nin yatay mimarisi, IoT veya oyun arka uçlarında görülenler gibi devasa ve öngörülemeyen iş yüklerinin, sistemi duyarlı ve hataya dayanıklı tutmak için birçok sunucuya yayılmasını sağlar.
Geçiş Stratejileri ve Araçlar
MySQL ilişkisel bir model kullanırken, MongoDB belge tabanlı bir model kullanır. Bu nedenle MySQL’den MongoDB’ye geçiş, hem veri yapılarını hem de uygulama mantığını yeniden düşünmek için dikkatli planlama gerektirir.
MySQL’den MongoDB’ye geçiş
MySQL’den MongoDB’ye geçiş için aşağıdaki adımları izleyin.
mysqldumpveya ETL betikleri kullanarak); gerektiğinde büyük tabloları yönetilebilir partilere bölün.mongoimportveya özel betikler kullanın. Ardından gerekli indeksleri oluşturun.Sonuç
MySQL ile MongoDB arasındaki seçim, uygulamanızın veriyi nasıl ele aldığına bağlıdır. MySQL’in sabit, tablo tabanlı şeması, ACID uyumluluğu, olgun SQL sorgulaması ve dikey ölçeklemesi; bankacılık veya e-ticaret gibi işlem ağırlıklı, yapılandırılmış raporlama senaryoları için idealdir.
MongoDB’nin şemasız belge modeli, esnek toplama hatları ve yerleşik yatay parçalama; gerçek zamanlı analiz, IoT telemetrisi ve içerik yönetimi gibi hızla evrilen, yüksek hacimli veya coğrafi olarak dağıtık kullanım durumlarında öne çıkar. İşlem güvenilirliği, şema esnekliği, sorgu karmaşıklığı ve ölçekleme stratejisi gibi faktörleri değerlendirerek, ekipler performans ve büyüme ihtiyaçlarıyla en iyi uyum sağlayan veritabanını seçebilir.
Her iki teknolojiyle de bugün başlayın: NoSQL'e Giriş veya Python ile MongoDB'ye Giriş kurslarımız.