İlişkisel ve İlişkisel Olmayan Veritabanı arasındaki fark nedir?


82

MySQL, PostgreSQL ve MS SQL Server gibi çözümlerin ilişkisel veritabanı sistemleri olduğunu ve NoSQL, MongoDB gibi çözümlerin İlişkisel Olmayan DBMS olduğunu biliyorum.

Bununla birlikte, iki tür sistem arasındaki farklar nelerdir?

Meslekten olmayan terimler tercih edilir.

Teşekkürler.


11
Bu ev ödevi değil ... ama bugün bir arkadaşıma farklılıkları açıklamaya çalışıyordum ve boş gelmeye başladım. Bu yüzden burada arama yapacağımı ve tatmin edici bir açıklama bulamadığımı düşündüm. O yüzden soracağımı düşündüm. Söylediğim farklılıklar, RDBMS ile tablolar arasında çok sayıda tablo ve birleşim olmasıdır. NoSQL'in birden fazla tablosu yoktur, sadece bir tablosu vardır ve anahtar-değer çiftlerini kullanır. Bunun doğru bir açıklama olup olmadığından emin değilim, bu yüzden soracağımı düşündüm.
marcamillion

Bu cevapları yararsız buldum çünkü soruyu gerçekten cevaplamadan sorunun ne kadar zor olduğu hakkında konuşmak için çok zaman harcıyorlar. Bu blog yazısını okuduktan sonra, ana fikir nosql'nin ölçeklendirmede sql dbs'den daha iyi olduğunu, yani ölçek büyütürken dağıtılır, yani tek bir makinede daha fazla hesaplama gücü artık bir seçenek değil jamesserra.com/archive/2015/08/…
mbigras

Yanıtlar:


23

İlişkisel veritabanlarının matematiksel bir temeli vardır (küme teorisi, ilişkisel teori) ve bunlar SQL == Yapılandırılmış Sorgu Dili olarak damıtılır.

NoSQL'in birçok formu (örneğin, belge tabanlı, grafik tabanlı, nesne tabanlı, anahtar-değer deposu, vb.) Tek bir temel matematiksel teoriye dayalı olabilir veya olmayabilir. S. Lott'un doğru bir şekilde işaret ettiği gibi, hiyerarşik veri depolarının gerçekten de matematiksel bir temeli vardır. Aynı şey grafik veritabanları için de söylenebilir .

NoSQL veritabanları için evrensel bir sorgu dilinin farkında değilim.


"böyle matematiksel temelleri yok" mu? Gerçekten mi? Hiyerarşik veritabanları bana oldukça matematiksel göründü. Karşılaştırıldığında bunlar nispeten basitti. XML veritabanı çalışanlarının hiyerarşik bir veritabanında nelerin yapılabileceği (ve yapılamayacağı) konusunda oldukça sağlam bir kilitleri olduğunu düşünüyorum.
S.Lott

Benim cehaletim veya buradaki aşırı basitleştirme olabilir, S. Lott. Bir referans arayacağım.
duffymo

1
Bu konuda uzman değilim, ancak hepsi yapılandırılmış veri oldukları için en azından bir SQL alt kümesinin herhangi bir modele uygulanabileceğine inanıyorum. Bu konuda, Google'ın Büyük Tablo code.google.com/appengine/docs/python/datastore/… için SQL'e sadık bir sorgu dilini açığa çıkarması hoşuma gidiyor . Gerçekten işleri çok daha kolay hale getirdi.
Filip Dupanović

43

Hmm, sorunun ne olduğundan tam olarak emin değilim.

Başlıkta Veritabanları (DB) hakkında soru sorarken, metninizin gövdesinde Veritabanı Yönetim Sistemleri (DBMS) hakkında soru soruyorsunuz. İkisi tamamen farklıdır ve farklı cevaplar gerektirir.

Bir DBMS, bir DB'ye erişmenizi sağlayan bir araçtır.

Verinin kendisinden başka, bir DB, bu verilerin nasıl yapılandırıldığına dair bir kavramdır.

Dolayısıyla, OO destekli olmayan bir derleyiciyle Oriented Object metodolojisi ile programlama yapabileceğiniz gibi veya tam tersi de, RDBMS olmadan ilişkisel bir veritabanı kurabilir veya ilişkisel olmayan verileri depolamak için bir RDBMS kullanabilirsiniz.

İlişkisel Veritabanının (RDB) ne anlama geldiğine odaklanacağım ve sistemlerin başkalarına ne yaptığı hakkındaki tartışmayı bırakacağım.

İlişkisel veritabanı (kavram), farklı 'tablolardan' veya farklı veri kümelerinden gelen bilgileri bağlamanıza izin veren bir veri yapısıdır. Bir veri grubu, anahtar veya dizin adı verilen şeyi içermelidir (bu, paket içindeki herhangi bir atomik veri yığınını benzersiz şekilde tanımlamaya izin verir). Diğer veri kümeleri, veri atomları ile anahtarın işaret ettiği atom arasında bir bağlantı oluşturmak için bu anahtara başvurabilir.

İlişkisel olmayan bir veritabanı, verileri farklı paketlerdeki verileri birbirine bağlamak için açık ve yapılandırılmış mekanizmalar olmadan yalnızca verileri depolar.

Böyle bir şemayı uygulamaya gelince, eğer bir indeksi olan bir kağıt dosyanız varsa ve farklı bir kağıt dosyada ilgili bilgiyi almak için indekse başvurursanız, o zaman oldukça basit de olsa bir ilişkisel veritabanı uygulamış olursunuz. Böylece, bir bilgisayara bile ihtiyacınız olmadığını görüyorsunuz (tabii ki, yardım edecek biri olmadan çok çabuk sıkıcı hale gelebilir), benzer şekilde bir RDBMS'ye ihtiyacınız yok, ancak muhtemelen bir RDBMS iş için doğru araçtır. Bununla birlikte, farklı araçların neler yapabileceğine dair farklılıklar olduğu söyleniyor, bu nedenle iş için doğru aracı seçmek o kadar kolay olmayabilir.

Umarım bu meslekten olmayan terimlerdir ve anlamanıza yardımcı olur.


"Eğer bir indeksi olan bir kağıt dosyanız varsa ve farklı bir kağıt dosyada ilgili bilgiyi almak için indekse başvurursanız, o zaman ilişkisel bir veritabanı uyguladınız" çok iyi bir örnek. Bu, birincil anahtarı, yabancı anahtarı vb. Açıklamak için daha da genişletilirse harika olur.
Zeni

İlişkisel bir veri tabanını kullanmak için kısıtlamalar hakkında bilgi sahibi olunması veya herhangi birini beyan etmesi veya beyan etmesi (PK'ler, CK'ler ve FK'ler dahil) gerekmez. Dürüstlük içindir. Tablolar ilişkiyi (gemileri) temsil eder. Birleştir ve diğer operatörler, ilişkileri (gemileri) bağımsız değişken tablolarının ilişkilerinin (gemi) kombinasyonları olan yeni tablolar almak için tabloları birbirine bağlar. Ayrıca dizinler uygulama optimizasyonu içindir ve bir veritabanı / DBMS'nin kullanıcılarıyla ilişkili olmasıyla ilgisizdir.
philipxy

22

"Bildiğiniz" çoğu şey yanlış.

Öncelikle, ilişkisel guruların birkaçının rutin olarak (ve bazen sert bir şekilde) belirttiği gibi, SQL pek çok insanın düşündüğü kadar ilişkisel teoriye pek uymuyor. İkincisi, "NoSQL" konusundaki farklılıkların çoğunun ilişkisel olup olmadığıyla göreceli olarak çok az ilgisi vardır. Son olarak, "NoSQL" in SQL'den nasıl farklı olduğunu söylemek oldukça zordur çünkü her ikisi de oldukça geniş bir olasılık yelpazesini temsil eder.

Güvenebileceğiniz en büyük fark, SQL'i destekleyen hemen hemen her şeyin, veritabanının kendisindeki tetikleyiciler gibi şeyleri desteklemesidir - yani, verilerin her zaman dahili olarak tutarlı olmasını sağlamak için uygun kuralları veritabanında tasarlayabilirsiniz. Örneğin, veritabanınızın bir kişinin bunu yapması gerektiğini iddia etmesi için bir şeyler ayarlayabilirsiniz.bir adresi var. Bunu yaparsanız, her kişi eklediğinizde, temelde sizi o kişiyi bir adresle ilişkilendirmeye zorlar. Yeni bir adres ekleyebilir veya bunları mevcut bir adresle ilişkilendirebilirsiniz, ancak öyle ya da böyle kişinin bir adresi olması gerekir. Aynı şekilde, bir adresi silerseniz, bu sizi ya şu anda o adreste bulunan tüm kişileri kaldırmaya ya da her birini başka bir adresle ilişkilendirmeye zorlar. Aynısını diğer ilişkiler için de yapabilirsiniz, örneğin her insanın bir annesi olmalı, her ofisin bir telefon numarası olmalı, vb.

Gibi şeyler de veritabanına başkası görünüyor, bu kişiyi eklerken eğer öyleyse, onlar da hiç kişiyi görmeyeceğim, illâ onlar kişiyi görürsünüz, atomik olarak garanti olduğunu Not ile adres (veya anne vb.)

NoSQL veritabanlarının çoğu, veritabanında bu tür bir zorlama sağlamaya çalışmaz . Verileriniz için gerekli tüm ilişkileri uygulamak, veritabanını kullanan kodda size bağlıdır. Çoğu durumda, kısmen doğru olan verileri görmek de mümkündür, bu nedenle, her kişinin ebeveynlerle ilişkilendirilmesi gereken bir aile ağacınız olsa bile, koyduğunuz kısıtlamaların gerçekten olmayacağı zamanlar olabilir. zorunlu. Bazıları bunu istediğinde yapmana izin verecek. Diğerleri bunun yalnızca geçici olarak gerçekleştiğini garanti eder, ancak tam olarak ne kadar süreceği / süreceği sorgulanabilir.


9

İlişkisel veritabanı, verileri ele almak için resmi bir tahminler sistemi kullanır. Altta yatan fiziksel uygulama özü yoktur ve belirli işlemleri optimize etmek için değişebilir, ancak her zaman ilişkisel modeli varsaymalıdır . Layman'ın terimleriyle, bu sadece tablomdaki (ilişkim) her satırın (tuple) kaç değere (öznitelik) sahip olduğunu tam olarak bildiğimi ve şimdi gerçeği buna göre, tamamen ve aşırı derecede kullanmak istediğimi söylüyor . Canavarın gerçek doğası budur . 

Açıkça ilişkisel olarak yetiştirilmiş bir nesil olduğumuz için, NoSQL veritabanı modellerine ilişkisel modelin perspektifinden bakarsanız, yine layman'ın terimleriyle bakarsanız, ilk bariz fark, bir satırdaki değerlerin sayısı hakkında hiçbir varsayımın içerir hiç. Bu, konuyu gerçekten fazla basitleştiriyor ve her NoSQL veritabanının fiziksel modellerinin karmaşıklığına açıkça uygulanmıyor, ancak ilişkisel modelin zirvesi ve geride bırakmamız gereken ilk varsayım ya da tercih ederseniz, en büyüğü yapmamız gereken sıçrama.

Her DBMS için doğru olan iki şeyi kabul edebiliriz: her türlü veriyi depolayabilir ve verileri akla gelebilecek herhangi bir şekilde yönetmeyi mümkün kılmak için yeterli matematiksel temellere sahiptir. Gerçek şu ki, iki noktadan herhangi birini teste koyma hatasını asla istemeyeceksiniz, bunun yerine sadece gerçek DBMS'nin gerçekte ne için yapıldığına bağlı kalın. Layman'ın terimleriyle: içindeki canavara saygı gösterin!

(İlişkisel model etrafında dönen (açıkça) sağlam temellere dayanan standartları, NoSQL veritabanları tarafından sağlanan birçok çeşniyle karşılaştırmaktan kaçındığımı lütfen unutmayın. İsterseniz, NoSQL veritabanlarını tamamen olmayan herhangi bir DBMS için bir şemsiye terim olarak düşünün İlişkisel modeli varsayalım, diğer her şeyi dışlayarak. Farklılıklar çok fazla, ancak temel fark bu ve ikisini anlamanız için en çok işinize yarayacağını düşünüyorum.)


6

Bu soruyu biraz teknolojiye atıfta bulunarak açıklamaya çalışın

Karşılaştırma için MongoDB ve Geleneksel SQL'i alın, Twitter'da Tweet yayınlama senaryosunu hayal edin. Bu tweet 9 resim içeriyor. Bu tweet'i ve ilgili resimleri nasıl saklarsınız?

Geleneksel ilişki SQL açısından, tweet'leri ve resimleri ayrı tablolarda saklayabilir ve yeni bir tablo oluşturarak bağlantıyı temsil edebilirsiniz.

Dahası, bir görüntü türü olan bir alan belirleyebilir ve 9 resmi bir ikili belgeye sıkıştırabilir ve bu alanda saklayabilirsiniz.

MongoDB'yi kullanarak şöyle bir belge oluşturabilirsiniz (ilişkisel SQL'deki tablo kavramına benzer):

{

"id":"XXX",

"user":"XXX",

"date":"xxxx-xx-xx",

"content":{

"text":"XXXX",

"picture":["p1.png","p2.png","p3.png"]

}

Dolayısıyla bence temel fark, verileri nasıl sakladığınız ve aralarındaki ilişkilerin depolama düzeyiyle ilgili.

Bu örnekte, veriler tweet ve resimlerdir. Aralarındaki depolama düzeyiyle ilgili farklı mekanizma da ikisi arasındaki farkta önemli bir rol oynar.

Umarım bu küçük örnek SQL ve NoSQL (ACID ve BASE) arasındaki farkı göstermeye yardımcı olur.

İşte NoSQL'in internetteki hedefleri hakkında bir resim bağlantısı:

http://icamchuwordpress-wordpress.stor.sinaapp.com/uploads/2015/01/dbc795f6f262e9d01fa0ab9b323b2dd1_b.png


gerçekten iyi bir açıklama, ilk fikre ulaştığım bağlantı var, umarım birine yardımcı olabilir. growthefuturenow.com/relational-vs-non-relational-database
Muhammed Sadiq

4

İlişkisel ve ilişkisel olmayan arasındaki fark tam olarak budur. İlişkisel veritabanı mimarisi, birinin bir ilişkide iki veya daha fazla tabloyu bağlamasına izin veren birincil anahtarlar, yabancı anahtarlar, vb. Gibi kısıtlama nesneleri sağlar. Bu, tablolarımızı normalleştirmemiz için iyidir, yani veritabanının neyi temsil ettiğine dair bilgiyi birçok farklı tabloya böleriz, bir kez verilerin bütünlüğünü koruyabiliriz.

Örneğin, bir çalışanla ilgili bilgileri içeren bir dizi masanız olduğunu varsayalım. Bu kayıtla ilgili tüm kayıtları diğer tablolardan silmeden tablodaki bir kaydı silemezsiniz. Bu şekilde veri bütünlüğünü uygularsınız. İlişkisel olmayan veritabanı, veri bütünlüğünü uygulamanıza izin verecek bu kısıtlama yapılarını sağlamaz.

Veritabanlarının tablolarını doldurmak için kullanılan ön uç uygulamasında bu kısıtlamayı uygulamazsanız, vahşi batı ile karşılaştırılabilecek bir karmaşa uyguluyorsunuz.


1

Öncelikle neden bir veritabanına ihtiyacımız olduğunu söyleyerek başlayayım.

Verimli bir şekilde depolanan verileri alabileceğimiz şekilde bilgileri düzenlemeye yardımcı olacak bir veritabanına ihtiyacımız var.

İlişkisel veritabanı yönetim sistemlerine (SQL) örnekler:

1) Oracle Veritabanı

2) SQLite

3) PostgreSQL

4) MySQL

5) Microsoft SQL Sunucusu

6) IBM DB2

İlişkisel olmayan veritabanı yönetim sistemlerine örnekler (NoSQL)

1) MongoDB

2) Cassandra

3) Redis

4) Couchbase

5) HBase

6) DocumentDB

7) Neo4j

İlişkisel veritabanları normalleştirilmiş verilere sahiptir, çünkü bilgiler tablolarda satırlar ve sütunlar biçiminde saklanır ve normalde veriler normalleştirilmiş formda olduğunda, veri fazlalığını azaltmaya yardımcı olur ve tablolardaki veriler normalde birbirleriyle ilişkilidir, bu nedenle veriyi geri almak istiyoruz, veriyi birleştirme deyimlerini kullanarak sorgulayabilir ve ihtiyacımıza göre veri alabiliriz. Bu, daha fazla yazma, daha az okuma ve fazla veri içermemek istediğimizde uygundur, aynı zamanda nispeten kolaydır Tablolardaki verileri ilişkisel olmayan veritabanlarına göre güncelleyin. Yatay ölçekleme mümkün değil, dikey ölçeklendirme bir ölçüde mümkün.CAP (Tutarlılık, Kullanılabilirlik, Bölme Toleranslı) ve ACID (Atomisite, Tutarlılık, İzolasyon, Süre) uyumluluğu.

Örnek olarak PostgreSQL kullanarak ilişkisel bir veritabanına veri girmeyi göstermeme izin verin.

Önce aşağıdaki gibi bir ürün tablosu oluşturun:

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric
);

sonra verileri ekleyin

INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', 9.99);

Başka bir farklı örneğe bakalım: görüntü açıklamasını buraya girin

Burada ilişkisel bir veritabanında, öğrenci tablosunu ve konu tablosunu ilişkileri kullanarak, yabancı anahtar, konu kimliği yoluyla bağlayabiliriz, ancak ilişkisel olmayan bir veritabanında ilişki olmadığı için iki belgeye sahip olmaya gerek yoktur, bu nedenle tüm konu ayrıntılarını ve bir belgedeki öğrenci ayrıntıları, öğrenci belgesinin ardından verilerin çoğaltıldığını ve bu da kayıtların güncellenmesini zahmetli hale getirdiğini söylüyor.

İlişkisel olmayan veritabanlarında sabit bir şema yoktur, veriler normalize edilmez. veriler arasında hiçbir ilişki oluşturulmaz, tüm veriler çoğunlukla tek bir belgeye yerleştirilir. Çok fazla veriyi işlemek için çok uygundur ve çok sayıda veriyi aynı anda aktarabilir, en iyisi yüksek miktarlarda okuma ve daha az yazma ve daha az güncelleme, verileri sorgulamak biraz zor, sabit bir şema olmadığı için. Yatay ve dikey ölçeklendirme mümkündür.CAP (Tutarlılık, Kullanılabilirlik, Bölme Toleranslı) ve BASE (Temelde Kullanılabilir, yumuşak durum, Sonunda tutarlı) uyumluluğu.

Mongodb kullanarak ilişkisel olmayan bir veritabanına veri girmek için bir örnek göstermeme izin verin

db.users.insertOne({name: ‘Mary’, age: 28 , occupation: ‘writer’ })
db.users.insertOne({name: ‘Ben’ , age: 21})

Dolayısıyla, bunu db adlı veritabanından anlayabilirsiniz ve kullanıcılar adında bir koleksiyon vardır ve veri eklediğimiz insertOne adlı belge vardır ve ilk kaydımızın 3 özniteliği ve ikinci özniteliğin yalnızca 2 özniteliği olduğundan sabit bir şema yoktur. , ilişkisel olmayan veritabanlarında bu sorun değildir, ancak ilişkisel veritabanları sabit bir şemaya sahip olduğundan, bu ilişkisel veritabanlarında yapılamaz.

Başka bir farklı örneğe bakalım

({Studname: ‘Ash’, Subname: ‘Mathematics’, LecturerName: ‘Mr. Oak’})

Dolayısıyla ilişkisel olmayan veritabanında, ilişkisel olmayan veritabanlarında hiçbir ilişki tanımlanmadığı için hem öğrenci ayrıntılarını hem de konu ayrıntılarını tek bir belgeye girebileceğimizi görebiliriz, ancak burada bu yol veri tekrarına yol açabilir ve bu nedenle güncellemede hatalar meydana gelebilir.

Umarım bu her şeyi açıklar


-1

Meslekten olmayan kişiler açısından, güçlü bir şekilde yapılandırılmış ve yapılandırılmamış, bu da DB'niz için farklı derecelerde uyarlanabilirliğe sahip olduğunuz anlamına gelir. Özellikle belirli bir referans indeksinin başka bir öğeye -> bu bir ilişkiye bağlanmasını sağlamanız gerektiği için indekslemede farklılıklar ortaya çıkar. İlişkisel DB'nin daha katı yapısı bu gereksinimden gelir.

NosDB'nin hem ilişkisel hem de ilişkisel olmayan DB'ler sağladığını ve hem http://www.alachisoft.com/nosdb/sql-cheat-sheet.html

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.