Neden bir sözlük sitesi için MySQL kullanmak kötü bir fikir?


55

Sözlük girişlerini (genellikle tek kelimeler) ve bunların anlamlarını başka bir dilde saklamak için bir veritabanı tasarlamayı ve düzenlemeyi planlıyorum. Bu nedenle, örneğin, Sözlük tablosunda giriş ve tanım bulunmalı ve her tablo kaydında saklanan bir kaydın kimliğine bir atıfta bulunmalıdır Tag(Her kayıtta bir etiket veya kategori olmalıdır).

Verilerim bir yapıya sahip olduğundan, bir SQL veritabanı kullanmanın (MySQL gibi) kötü bir fikir olmadığını düşündüm; Ancak insanlar MongoDB'nin performans için daha iyi olduğunu söylüyor.

İstemci tarafında, uygulamanın, arka uç tarafından sağlanan bir REST API'sini tüketen otomatik tamamlama özelliğine sahip bir arama kutusu sağlayabilmesi gerekir. Böyle bir senaryoda MySQL ile gitmek güvenli midir? Ya da MongoDB veya ElasticSearch'ü bunun için başka bir çözüm kullanmalı mıyım? Bu şekilde yüz binlerce kaydın saklanması ve erişilmesi gerekiyor.


79
Sana şeyler söyleyen insanlar bu konuda çok fazla araştırma yapmadılar. En büyük kelime dağarcığına sahip olan İngiliz dili, bir milyondan fazla kelimeden daha azdır. Bu ilişkisel bir DB'nin performans yetenekleri alanında da var.
TheCatWhisperer

25
Burada MySQL'in bunun için iyi çalışmadığını düşünmeme neden olacak hiçbir şey görmüyorum. Basit bir aramadaki performans sorun olmaz ve o rotaya gitmeniz gerekiyorsa tam metin araması yapar.
GrandmasterB

46
"MongoDB performans için çok daha iyi" ile ilgili olarak - kapsam açıklığa kavuşturulmamış değiştirilmemiş bir ifade olarak bu saçmalıktır. Örneğin, bkz. Komut Satırı Araçları, Hadoop Kümenizden 235 kat daha hızlı olabilir ( Web Sitesi Obezite Krizi'ndeki bir bağlantıdan karşılaştım ).
Wildcard

82
İlişkisel veritabanlarının kötü olduğunu ve MongoDB'nin daha iyi olduğunu söyleyen insanlardan çok yoruldum çünkü daha hızlı. Bu, arabaların kötü olduğunu ve uçakları kullanmamız gerektiğini çünkü daha hızlı seyahat ettiklerini söylemek gibi bir şey. Benim tavsiyem, böyle tavsiyelere aldırmamak.
Brandon,

13
@Brandon Üzücü olan şey, "NoSQL'in çok daha hızlı olduğu" iddialarının genellikle, neden daha iyi olmaları gerektiğine dair teorik bir açıklama ile ortaya çıkıyor, ancak uygulamada birçok gerçek dünya senaryosu için bile geçerli değil. Örneğin buraya bakınız . Kullanılmış benchmark takımı açık kaynak kodludur ve github'da da mevcuttur. Hell CERN, PB verilerini OracleDB ile gayet iyi yönetiyor.
Voo

Yanıtlar:


95

Bunun neden kötü bir fikir olduğunu söyleyemem. İlişkisel bir veritabanının neden iyi bir fikir olduğu konusunda size birkaç neden söyleyebilirim .

  1. Herkesin bir tanım için bir sözlük istemediğini unutmayın. Şundan çok kez, doğru yazımı bulmak için bir sözlük kullanılır. Bu, sadece bir samanlıkta iğne bulamadığınız anlamına gelir , kullanıcı tarafından tarif edilene benzer iğneler ararsınız (bir deyim kullanabilirsem).

    Sadece birincil anahtar aramaları yapmayacaksınız. Anahtar kelime aramaları yapacaksınız

  2. Kelimelerin anlamı veya imla ile ilgisi olabilir ( oku, oku , kırmızı ve kamış )

    Ne zaman "ilgili" kelimesini gördüğünüzde "İlişkisel Veri Tabanı" deyin

  3. Hıza ihtiyacınız varsa, bozuk bir ilişkisel veri modelini değil, ilişkisel veritabanınızı önbelleğe almanız gerekir.

  4. Düzgün bir şekilde normalize edilmiş bir veritabanı, atılması gereken daha az bit olduğundan birincil anahtar aramalarını ve aramaları hızlandırır.

  5. Normalleştirilmiş veritabanlarının daha yavaş olduğunu söyleyenler bunun doğru olduğu vakaların% 0,1'ini kastediyor. Olguların diğer% 99.9 onlar değil aslında performans ilk elden görmek, bu yüzden onları görmezden gerçekten normalize veritabanı ile çalıştı. Normal bir veritabanıyla çalıştım. Sevdim. Geri dönmek istemiyorum. Ve ben veritabanı görevlisi değilim. Ben bir C # / JavaScript / HTML / Ruby adamım.

  6. Kelimelerin kökeni var. Aslında, aynı dilde birçok kelime farklı bir dilde başka bir kelime olan aynı kökene sahip olabilir. Mesela, özgeçmiş (işverenlerin web sitelerine yüklediğimiz ve önümüzdeki 7 yıl boyunca sürekli telefon görüşmeleri ve e-postalar alabilmemiz için kullanılan) Fransızca bir kelimedir.

  7. Sözlük aynı zamanda ne tür bir kelime olduğunu da tanımlar (isim, fiil, sıfat vb.). Bu sadece bir metin parçası değil: "isim" de anlamı var. Ayrıca ilişkisel bir veritabanı ile "bana İngilizce dilindeki tüm isimleri ver" gibi şeyler söyleyebilirsiniz ve normalize edilmiş bir veritabanı yabancı anahtarlar kullanacağından ve yabancı anahtarların (veya olması gereken) dizinleri olduğundan, arama çok kolay olacaktır.

  8. Kelimelerin nasıl telaffuz edildiğini düşünün. Özellikle İngilizce'de birçok kelime aynı telaffuza sahip (yukarıdaki örneğime okuma ve reed veya okuma ve kırmızı ile bakın).

    Bir kelimenin telaffuzu, kendisi, başka bir kelimedir. İlişkisel bir veritabanı, herhangi bir telaffuz için yabancı anahtar kullanmanıza izin verir. Bu bilgi ilişkisel bir veritabanında çoğaltılmaz. SQL olmayan bir veritabanında deli gibi çoğaltılır.

  9. Şimdi kelimelerin çoğul ve tekil versiyonlarından bahsedelim. :) "Kayığı" ve "kayığı" düşünün. Veya bir kelimenin "tekil" veya "çoğul" olduğu gerçeğidir.

  10. Ah! Ve şimdi en geçmiş zaman, şimdiki zaman, gelecek zaman ve şimdiki sıfat bahsedelim (dürüst olmak gerekirse, ben bok "Mevcut ortacı" ne olduğunu bilmiyorum. Ben de "ing" ile biten kelimeler ile ilgili bir şey olduğunu düşünüyorum İngilizce ya da bir şey).

    "Koş" u ara ve diğer zamanları görmelisin: koş, koş, koş

    Aslında "gergin" bir başka ilişkidir.

  11. İngilizce bunu pek yapmaz, ancak cinsiyet, bir kelimeyi tanımlayan başka bir şeydir. İspanyolca gibi diller, ismin öznesinin erkek mi kadın mı olduğunu tanımlamaktadır. Bir cümle için boşlukları doldurmanız gerekirse, birçok dilde cinsiyet çok önemlidir.

    Cinsiyeti belirlemek için her zaman dil sözleşmelerine güvenemeyeceğinizden (İspanyolca olarak, "o" ile biten kelimeler eril / erkek, ancak tüm kelimeler için bu doğru değildir), tanımlayıcı bir değere ihtiyacınız var: Erkek veya Kadın. Bu normalize edilmiş bir veritabanının milyonlarca kayıtta bile incelikle ele aldığı başka bir ilişkidir.

Tüm bükülmüş kurallar ve kelimeler ve hatta farklı diller arasındaki ilişkiler sayesinde, bu veri deposunu SQL-olmayan bir çözüm gibi bir "belge deposu" olarak düşünmek zor. Sözler ve bileşenleri arasında çok fazla ve çok çeşitli ilişkiler vardır, ilişkisel bir veritabanı tek mantıklı çözümdür.


7
# 1 için endeksleme genellikle ilişkisel olmayan tekliflerin güçlü yanlarından biridir;
JimmyJames

61
@JimmyJames Bir dakika boyunca ilişkisel sistemlerin aynı tür indeksleri kullanmadığını düşünmeyin. Bu tekniklerin çoğu o dünyada öncülük etti.
Blrfl

14
Msgstr "" ile ilgili "kelimesini her gördüğünüzde" İlişkisel Veri Tabanı "deyin. Katılmıyorum "İlişkisel veritabanında" "ilişkisel", perdelerin kendilerine atıfta bulunur. İlgili kadar çok geniş herhangi bir su tutmak için bu deyimi için bir terimdir
Gardenhead

12
Ayrıca geleneksel birleşimler yapmaktan ziyade çapraz ilişkilere odaklanan grafik veritabanları (Neo4j akla geliyor) da var. Bu, pek çok sözlükçünün aslında kelimelerin ağları olduğu düşünüldüğünde, avantajlı olabilir; örneğin, WordNet projesi geleneksel bir RDMS yerine kendi grafik formatını kullanır.
tucuxi

4
Bu cevabı yalnızca "ilgili 'düşünün' İlişkisel Veri Tabanı 'kelimesini gördüğünüzde" kelimesi ne zaman görürsünüz? Bu saçmalık . İlişkisel veritabanlarını seviyorum, ancak ilişkisel model her türlü ilişki için uygun değil . Normalleştirilmiş verilere bakışınız da tamamen yanlış. Verilerin normalleştirilmesi düzenlemeleri optimize eder , çünkü veriler çoğaltılmaz, arama yapmaz. (Bu nedenle DB'leri rapor etmek normal değildir. Boyutsal modelleme tekniklerini ve yıldız şemalarını kullanırlar.) Ne hakkında konuştuğunuzu bildiğinizi sanmıyorum. 80 oylama, bu sitedeki tavsiyelerle ilgili tüm endişelerimi onaylıyor.
jpmc26

27

Anahtar-değer deposuyla giderseniz (size daha fakirleştirilmiş bir programlama modeli sunar) ve daha fazla yapıya ihtiyacınız varsa (sizin durumunuzda, örneğin üçüncü bir dil ekleyerek) ya da katılımlarla ilgili daha karmaşık sorgular yapmanız gerekiyor. , ihtiyacınız olanı bulmak için anahtarlarınızı yeniden düzenlemek, verilerinizi normalleştirmek ve / veya tüm verilerde dolaşmak için çok zaman harcayacaksınız.

İlişkisel bir veritabanıyla başlarsanız, uygulamanızın tasarımı, kodu ile çalışabilir ve onu anahtar-değer formuna koymak yerine, uygulamanız için doğal veri modeline yoğunlaşarak deneyebilirsiniz.

Uygulama kapandığında, çeşitli seçenekleri ölçerek performans üzerinde çalışabilirsiniz. Teknolojileri değiştirmek zorunda kalmadan önce SQL'de yapılması gereken birkaç performans püf noktası vardır. Başvurunuz hakkında çok şey öğrendiniz ve ilişkiselinizin sizi incitip incitmeyeceğine ve veri modeliniz için anahtar değerin işe yarayıp yaramadığına karar vermek için daha iyi bir konumda olacaksınız.

Anahtar-değerin uygulamanızın tam olarak ihtiyaç duyduğu şey olduğu ortaya çıkarsa, ilişkisel modelde kayda değer bir yatırım yapmadan geçiş yapabilirsiniz, oysaki çevrenizdeki diğer yol, anahtar-değer modelini yapmak için zaman harcamanıza neden olabilir. ilişkisel modelde önemsiz.

İlişkisel veritabanınızı, etki alanınız ve kullanıcılarınız hakkında daha fazla şey öğrenirken sürekli değişen gereksinimler karşısında uygulamanızı tasarlamanızı, yazmanızı ve çalıştırmanızı sağlamak için bir hızlandırıcı olarak düşünün.

Milyonlarca kullanıcınız olduğunda, başlangıçta bir anahtar-değer seçmiş olsanız bile, kesinlikle tasarımı yine de yeniden düzenlemelisiniz.


13
Bu makaledeki epilog, bir tasarımı geçersiz kılan gereksinimlerin değiştirilmesi senaryosunu tam olarak açıklar. Bir (gerçek) başvuruyu "MongoDB için mükemmel bir kullanım örneği" olarak nitelendiriyor, ancak daha sonra, bir RDBMS'de uygulamak için önemsiz olan ve makul miktarda iş gerektirecek şekilde gereksinimlerdeki nispeten küçük bir değişikliğin nasıl yapıldığını açıklıyor. Bir kullanım durumuna göre (makalenin önceki bölümlerinde açıklandığı gibi) Mongo için iyi bir kullanım örneği değildir.
Derek Elkins,

5
Sarah'ın MongoDB makalesi tam olarak, onu kullanarak geliştirdiğimiz 1.0 ürünle yaşadıklarımız; 1.1'e kadar Postgres kullanıyorduk.
Joe,

@DerekElkins, süper referans, teşekkürler!
Erik Eidt

1
"ancak daha sonra, bir RDBMS'de uygulamak için önemsiz olan, gereksinimlerdeki nispeten küçük bir değişimin nasıl olacağını açıklar" Tabii, ancak bunun tersi doğrudur. RDBMS'leri işte kullanıyoruz ve MongoDB'de çözülmesi önemsiz meselelerle karşı karşıyayız. Garip bir şekilde, yazılım gereksinimleri her zaman kullandığımız araçların yetenekleriyle mükemmel şekilde eşleşmiyor.
NPSF3000

@ NPSF3000, bir blog ya da bunun üzerine yazılmış bir metin gibi bir referanstan bahsederseniz harika olur!
Erik Eidt

10

Bu kadar küçük bir veri tabanı için muhtemelen performans açısından pek bir fark yaratmayacak. Standart bir RDBMS burada berbat bir fikir değil, çünkü belli bir girişin yazdıklarından çok daha fazla okunması gerekiyor. Performans bunun için birincil bir sürücü gibi görünmüyor. Uygulama katmanında önbellekleme ayrıca bu endişeleri azaltır.

Diğer bir husus, çoğaltma ve esnekliktir. İlişkisel veritabanları, tek bir örnek çevresinde tasarlanma eğilimindedir. CAP teoremini okumalı ve sizin için en önemli olanı düşünmelisiniz.


CAP nispeten normal bir web uygulamasına nasıl uygulanır? Kitinize bağlı olarak, binlerce gelen bağlantıyı sürdürme olasılığınız yüksektir ve bir sayfa önbellek katmanı, bir mükemmellik sırasına göre artabilir. CAP, yalnızca dağıtılmış sistemler hedefinize ulaşmanın tek yolu olduğunda göz önünde bulundurmanız gereken bir şey olmaya başlar .
Ben,

2
@ Ben Esneklik kendi başına bir amaçtır. Bir uygulama için tek bir başarısızlık noktasına sahip olmak kabul edilebilir değilse, dağıtılmış çözümler bir çözüm sunar. RDBMS dışı çözümler buna yönelik olma eğilimindedir. Dikkate alınması gereken bir şey değil. Gecikme ve kullanılabilirlik kaygı vericidir. Gereksiniminiz% 99.9 çalışma süresine sahip olmaksa. Senede sadece yaklaşık 9 saat düşebilir ve bir db'deki verileri kaybetmek felakettir, bu yüzden çoğaltma / yedeklemeler / anlık görüntüler için hesap yapmanız gerekir. Her şeyi basitleştirdiğini düşünmek yanlış yönlendirilmiş.
JimmyJames,

2

Bu NoSQL veritabanları, başlangıçta her zaman iyi bir fikir gibi görünür, ancak örneğin, örneğin, anahtar kelimelerin değerlerine göre (veya bunların bir kısmına göre bakılması gereken), uç vakalarla uğraşırken sorunla karşılaşmanız garanti edilir.

Başlangıçta ilişkisel bir veritabanı ile gitmek ve daha sonra denormalize etmek daha güvenli bir seçenek olacaktır. MySQL bu amaç için mükemmeldir (metin tabanlı arama ile basit ilişkisel veritabanları), bu tür verilerle uğraşırken bulacağınız çok fazla kullanım örneği yoktur. Dizinlerinizin doğru kurulduğundan emin olun ve bir NoSQL veritabanına göre karşılaştırılabilir bir seviyede (veya bir metin araması yaparken daha iyi bir performans gösterecek) bulunmasını sağlayın ve uygulama mantığınızı değiştirmeden değiştirme esnekliği sunar. somut bir veri yapısına bağlı.

Verilerinizin en yaygın kullanımını bulduğunuzda (ve performans gereksinimlerinizi karşılamadığını görürseniz), yüklenebilecek (ve alınabilecek) bir ayar biçimine çıkarak verileri normalize etmeye devam edebilirsiniz. NoSQL şeması.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.