Co to jest baza danych magazynu kluczy / wartości?

56

Przeglądałem stronę Wikipedii dotyczącą NoSQL i zawiera ona kilka odmian bazy danych magazynu kluczy / wartości, ale nie mogę znaleźć żadnych szczegółów na temat tego, co to znaczy przez magazyn kluczy / wartości w tym kontekście. Czy ktoś mógłby mi wyjaśnić lub powiązać wyjaśnienie ze mną? Ponadto kiedy miałbym korzystać z takiej bazy danych?

indyk1ng
źródło
3
Cześć @ indyK1ng ... Zauważyłem, że prawdopodobnie zadałeś kilka pytań na stronie, ale nie skomentowałeś wielu pytań. Witryna koncentruje się na INTERAKCJI społeczności i jednym ze sposobów, w jaki to robimy, jest akceptowanie odpowiedzi dobrej jakości i udzielanie informacji zwrotnej, gdy odpowiedzi nam nie pomagają. Chciałbym zachęcić cię do zaakceptowania odpowiedzi lub dodania komentarza tam, gdzie nie pomogą. Dzięki!
jcolebrand
Niestety jestem w trochę niezręcznej sytuacji. Popełniłem z powrotem, gdy propozycja była szerszą nazwą baz danych, nie zwróciłem uwagi, a potem zobaczyłem, że przechodzi w prywatną wersję beta, zanim wiedziałem, że została zmieniona na Administratorów baz danych. Bardziej interesują mnie wewnętrzne bazy danych, ale chcę wypełnić moje zobowiązanie. Przepraszam.
indyK1ng 28.01.11
1
Co powstrzymuje cię przed zadawaniem tego rodzaju pytań? Idź do Meta, zbadaj. Też chcemy zadać te pytania. A może zamierzasz chcieć dokładniejszych informacji o tym, jak NoSQL działa w jego wewnętrznych elementach? Mogę też w to zagłębić, ale nie czułem, żeby to był zakres tego pytania.
jcolebrand
1
Ponadto akceptacja nie jest grzechem, nawet jeśli nie chcesz tu być, i pomaga tym z Google'a lub podobnym. Nie mówię „zaakceptuj wszystkie moje odpowiedzi, potrzebuję przedstawiciela”, ponieważ możesz zobaczyć, czy odwiedzisz mój profil, ja nie. Bardziej interesuje mnie to, że przyszli użytkownicy mogą czerpać korzyści z kierunku „to, co pytający uznał za przydatne”.
jcolebrand
@jcolebrand Myślałem, że tego rodzaju pytania zostały uznane za nie na temat, sądząc po zmianie nazwy. Właśnie dlatego to pytanie i kilka innych moich pytań zostało sformułowanych w taki sposób, w jaki były, aby były po stronie tematu. Dzięki za informację, że zacznę być bardziej aktywny, kiedy będę miał szansę (college stara się nie spieszyć, teraz zwlekam;)).
indyK1ng 28.01.11

Odpowiedzi:

42

Czy znasz koncepcję pary klucz / wartość? Zakładając, że znasz Java lub C #, jest to w języku map / hash / datatable / KeyValuePair (ostatnia jest w przypadku C #)

Sposób działania pokazano na poniższym przykładowym wykresie:

Color        Red
Age          18
Size         Large
Name         Smith
Title        The Brown Dog

Jeśli masz klucz (po lewej) i wartość (po prawej) ... zauważ, że może to być ciąg, int lub tym podobne. Większość obiektów KVP pozwala przechowywać dowolny obiekt po prawej stronie, ponieważ jest to tylko wartość.

Ponieważ zawsze będziesz mieć unikalny klucz do konkretnego obiektu, który chcesz zwrócić, możesz po prostu zapytać bazę danych o ten unikalny klucz i uzyskać wyniki z dowolnego węzła, który ma obiekt (dlatego jest dobry dla systemów rozproszonych, ponieważ istnieją inne rzeczy, takie jak odpytywanie dla pierwszych n węzłów, aby zwrócić wartość pasującą do zwrotów innych węzłów).

Teraz mój przykład powyżej jest bardzo prosty, więc oto nieco lepsza wersja KVP

user1923_color    Red
user1923_age      18
user3371_color    Blue
user4344_color    Brackish
user1923_height   6' 0"
user3371_age      34

Jak widać, proste generowanie klucza polega na umieszczeniu „użytkownika” unikalnego numeru użytkownika, znaku podkreślenia i obiektu. Ponownie, jest to prosta odmiana, ale myślę, że zaczynamy rozumieć, że dopóki możemy zdefiniować część po lewej stronie i konsekwentnie ją sformatować, możemy wyciągnąć wartość.

Zauważ, że nie ma ograniczeń co do wartości klucza (ok, mogą istnieć pewne ograniczenia, takie jak tylko tekst) lub właściwości value (mogą istnieć ograniczenia rozmiaru), ale jak dotąd nie miałem naprawdę złożonych systemów. Spróbujmy pójść trochę dalej:

app_setting_width      450
user1923_color         Red
user1923_age           18
user3371_color         Blue
user4344_color         Brackish
user1923_height        6' 0"
user3371_age           34
error_msg_457          There is no file %1 here
error_message_1        There is no user with %1 name
1923_name              Jim
user1923_name          Jim Smith
user1923_lname         Smith
Application_Installed  true
log_errors             1
install_path           C:\Windows\System32\Restricted
ServerName             localhost
test                   test
test1                  test
test123                Brackish
devonly
wonderwoman
value                  key

Wpadłeś na pomysł ... wszystkie te byłyby przechowywane w jednej ogromnej „tabeli” w rozproszonych węzłach (za tym wszystkim kryje się matematyka) i po prostu zapytałeś system rozproszony o wartość, której potrzebujesz według nazwy.

Przynajmniej tak rozumiem, jak to wszystko działa. Mogę mieć kilka rzeczy źle, ale to są podstawy.


obowiązkowy link do Wikipedii http://en.wikipedia.org/wiki/Associative_array

jcolebrand
źródło
1
zamiast edytować zamierzam po prostu dołączyć ten link en.wikipedia.org/wiki/Distribut_hash_table i wskazać, że tu właśnie pojawia się magia skalowalności NoSQL oraz że masz dwie opcje: albo zrozum matematykę stojącą za tym, dlaczego to jest działa lub zaufaj, że faceci, którzy wdrażają systemy, rozumieją matematykę w tym zakresie. Polecam także podcasty FLOSS dla MongoDB i kilku innych grup NoSQL, ponieważ mówią o tych sprawach bardziej szczegółowo twit.tv/floss
jcolebrand
Jaka jest zatem różnica między bazami danych Key / Value a tradycyjnymi wierszami?
skan
1
Fakt, że często są tylko dwie (lub trzy lub kilka, w zależności od zaangażowanych metadanych) kolumny zamiast ogromnej liczby kolumn, a typy są często naprawione. Nie ma powodu, aby NIE tworzyć sklepu KVP w tradycyjnym RDBMS, poza tym, że jest to w zasadzie schematyczny.
jcolebrand
Nie jest dla mnie jasne, dlaczego zrobiłbyś to user1923_color: red, user1923_age: 18, ...w przeciwieństwie do user1923: {color: red, age: 18, ...}.
aroth
1
Podcast FLOSS na temat MongoDB znajduje się na twit.tv/shows/floss-weekly/episodes/105
eleijonmarck
25

W ujęciu SQL baza danych NoSQL to pojedyncza tabela z dwiema kolumnami: jedna jest kluczem (podstawowym), a druga jest wartością. I to wszystko, to cała magia NoSQL.

Używałbyś NoSQL z jednego głównego powodu: skalowalności.

Jeśli Twoja aplikacja musi obsługiwać miliony zapytań na sekundę, jedynym sposobem na osiągnięcie tego jest dodanie większej liczby serwerów. To jest bardzo tanie i łatwe z NoSQL. Natomiast skalowanie tradycyjnej bazy danych SQL jest znacznie bardziej skomplikowane.

Tylko największe witryny faktycznie korzystają z pełnego potencjału NoSQL, tj. Facebook, mając tysiące serwerów z Cassandrą .

Zdecydowanie polecam przeczytać ten post na blogu, porównując SQL, NoSQL i ORM:

http://seldo.com/weblog/2010/07/12/in_defence_of_sql

vz0
źródło
Dlatego powinienem edytować swoją odpowiedź, aby wyjaśnić, jak działa skalowalność ... Zapomniałem wyjaśnić tę część zeszłej nocy.
jcolebrand
2
Argumentowałbym, że innym dobrym przykładem użycia NoSQL jest elastyczność schematu. DB, takie jak Mongo i KVP, nie dbają o to, co tam masz. Jeśli przeszukasz bazę danych, która nie ma określonego pola, po prostu nic nie zwróci.
Snowburnt
13

Zakładam, że masz podstawową wiedzę na temat ruchu NoSQL i modeli nierelacyjnych baz danych.

Magazyn wartości kluczowych jest jednym z nierelacyjnych modeli baz danych, takich jak wykresy, modele baz danych zorientowane na dokumenty.

Magazyny kluczowych wartości i ruch NoSQL

Ogólnie SQL radził sobie ze specjalnie ustrukturyzowanymi danymi i umożliwiał wysoce dynamiczne zapytania zgodnie z potrzebami danego działu.

Chociaż nadal nie ma prawdziwych konkurentów dla SQL w tej konkretnej dziedzinie, przypadek użycia w codziennych aplikacjach internetowych jest inny. Nie znajdziesz wysoce dynamicznego zakresu zapytań pełnych połączeń zewnętrznych i wewnętrznych, związków i złożonych obliczeń na dużych tabelach. Zazwyczaj znajdziesz bardzo zorientowany obiektowo sposób myślenia. Zwłaszcza w przypadku przyjęcia takich wzorców, jak MVC, dane w zapleczu zwykle nie są modelowane dla bazy danych, ale dla logicznej integralności, która pomaga również ludziom poradzić sobie ze zrozumieniem ogromnej infrastruktury oprogramowania. Aby umieścić te modele obiektowe w relacyjnych bazach danych, należy przeprowadzić dużą normalizację, która prowadzi do skomplikowanych hierarchii tabel i całkowicie przeciwstawia się głównej idei programowania obiektowego.

Fakt, że SQL pozwala na dowolne dynamiczne zapytania dla złożonych zestawów danych, staje się bezużyteczny dzięki użyciu bazy danych SQL tylko do trwałego przechowywania danych obiektowych, co w zasadzie robi większość aplikacji w dzisiejszych czasach.

To tutaj wchodzą sklepy Key Value. Key value stores allow the application developer to store schema-less data. This data is usually consisting of a string which represents the key and the actual data which is considered to be the value in the "key - value" relationship. Same dane są zwykle pewnego rodzaju prymitywem języka programowania (ciąg, liczba całkowita, tablica) lub obiektem, który jest sterowany przez powiązania języków programowania ze składnicą wartości klucza. Zastępuje to potrzebę posiadania stałego modelu danych i sprawia, że ​​wymóg dotyczący poprawnie sformatowanych danych jest mniej rygorystyczny.

They all allow storage of arbitrary data which is being indexed using a single key to allow retrieval. Największą różnicą w przypadku „prostszych” sklepów jest sposób (lub niemożność) uwierzytelnienia lub uzyskania dostępu do różnych sklepów (jeśli to możliwe). Chociaż przewaga szybkości w przechowywaniu i pobieraniu danych może być powodem do rozważenia tego w porównaniu ze zwykłymi bazami danych SQL, kolejną dużą zaletą, która pojawia się przy korzystaniu ze składnic klucz-wartość, jest to, że wynikowy kod wygląda na czysty i prosty w porównaniu z osadzonymi ciągami SQL w twój język programowania. Jest to coś, z czym ludzie walczą przy użyciu struktur mapowania obiektowo-relacyjnego, takich jak Hibernacja lub Active Record. Posiadanie odwzorowań relacyjno-obiektowych w zasadzie wydaje się emulować składnicę wartości klucza poprzez dodanie wielu naprawdę złożonych kodów między bazą danych SQL a obiektowym językiem programowania.

Cała społeczność ludzi zbiera się pod tagiem „ NoSQL ” i dyskutuje o zaletach i wadach korzystania z alternatyw dla systemów zarządzania bazami danych. czytaj dalej
Jest to nieco stary artykuł, ale uważam go za bardzo przydatny.

when would I use such a database? Could someone explain or link an explanation to me?
To raczej decyzja architektoniczna i dyskusyjna ... Musisz wziąć pod uwagę wiele czynników, takich jak skalowalność, wydajność itp.

Zobacz poniższe slajdy / artykuły, a dowiesz się, kiedy, dlaczego i dlaczego nie skorzystać ze sklepu z kluczowymi wartościami :)

CoderHawk
źródło
12

Inni to wyjaśnili, ale i tak zamierzam go dźgnąć.

Baza danych kluczy / wartości przechowuje dane według klucza podstawowego. To pozwala nam jednoznacznie zidentyfikować rekord w wiadrze. Ponieważ wszystkie wartości są unikalne, wyszukiwania są niezwykle szybkie: zawsze jest to zwykłe wyszukiwanie dysku.

Wartość jest po prostu jakąkolwiek wartością. Sposób przechowywania danych jest nieprzejrzysty dla samej bazy danych. Kiedy przechowujesz dane w magazynie kluczy / wartości, baza danych nie wie ani nie obchodzi, czy jest to XML, JSON, tekst czy obraz. W efekcie to, co robimy w magazynie kluczy / wartości, przenosi odpowiedzialność za zrozumienie, w jaki sposób dane są przechowywane z bazy danych w aplikacjach, które pobierają nasze dane. Ponieważ masz tylko jeden zakres kluczy do zmartwienia dla każdego segmentu, bardzo łatwo jest rozłożyć klucze na wiele serwerów i użyć rozproszonych technik programowania, aby umożliwić szybki dostęp do tych danych (każdy serwer przechowuje zakres danych) .

Wadą tego podejścia do danych jest to, że wyszukiwanie jest bardzo trudnym zadaniem. Musisz albo odczytać każdy rekord w segmencie danych, albo samodzielnie zbudować indeksy wtórne .

Istnieje kilka powodów, dla których warto skorzystać z bazy danych kluczy / wartości:

  • Kiedy wydajność zapisu jest twoim najwyższym priorytetem. Mozilla Test Pilot używa bazy danych kluczy / wartości do szybkiego rejestrowania danych.
  • Kiedy odczyty są gwarantowane tylko przez PK.
  • Podczas pracy z płaskim modelem danych.
  • Podczas pracy z bogatym, złożonym modelem danych, którego nie można modelować w RDBMS.

Istnieje tak wiele powodów, aby używać bazy danych kluczy / wartości, jak RDBMS, i tyle samo argumentów uzasadnia się jeden nad drugim. Ważne jest, aby przyjrzeć się, w jaki sposób odpytujesz swoje dane i zrozumieć, w jaki sposób ten wzorzec dostępu do danych określa sposób wstawiania i przechowywania danych.

Pamiętaj tylko, że baza danych kluczy / wartości jest tylko jednym typem bazy danych NoSQL.

Jeremiasz Peschka
źródło
8

Jeśli masz relacyjną bazę danych, możesz łatwo eksperymentować z tym:

create table keyvalue (my_key varchar2(255), my_value varchar2(255));
create unique index ix_keyvalue on keyvalue (my_key, my_value);

Tak były kiedyś wszystkie bazy danych, z dobrym przykładem Berkeley DBM , od 1979 roku. Od tego czasu wszystko się rozwinęło ( w każdym RDBMS można mieć wiele wartości na klucz). W przypadku wielu aplikacji wystarczający jest magazyn kluczy i wartości (np. W ten sposób sendmail przechowuje swoje aliasy). Ale jeśli wcześniej przetwarzasz wartość we własnym kodzie (lub konkatenujesz ciągi znaków, aby utworzyć „klucz”), być może dzieląc wartość na separator lub analizując go, zanim będzie można go użyć, prawdopodobnie lepiej RDBMS i przechowywanie go w ten sposób.

Gajusz
źródło
Nadal nie jest jasne od Gaiusa, co nowa DB „Klucz-wartość” może zrobić, czego nie może zrobić tabela, którą opisał powyżej. Oprócz dzielenia tabeli na różne tabele na różnych węzłach serwera.
GyRo
2
Podział jest najważniejszą różnicą, i nie pomijaj go. Gdy masz TONĘ danych, które mogą być przetwarzane równolegle, odzyskanie ich z wielu serwerów może być ogromną różnicą prędkości.
user441521 18.04.17