Nie mogę odpowiedzieć na pytanie, kiedy użyć magazynu danych klucz-wartość (w tym przypadku), ale mogę pokazać niektóre przykłady i odpowiedzieć na przykład stackoverflow.
Przy dostępie do bazy danych większość potrzebnych informacji to sklep z kv. Na przykład użytkownik loguje się przy użyciu nazwy użytkownika "joe". Sprawdzasz "user: joe" w swojej bazie danych i odzyskujesz swoje hasło (oczywiście hash). A może masz hasło pod "user: pass: joe", to naprawdę nie ma znaczenia. Jeśli był to przepełnienie stosu i renderowałeś stronę http://stackoverflow.com/questions/6935566/when-to-use-a-key-value-store-for-web-development
, szukałeś "pytania: 6935566" i używałeś tego. Łatwo jest zobaczyć, w jaki sposób sklepy Kv mogą rozwiązać większość problemów.
Chciałbym powiedzieć, że sklep z kv jest podzbiorem funkcjonalności oferowanym przez tradycyjny RDMS. Dzieje się tak, ponieważ projekt tradycyjnego RDMS zapewnia wiele problemów związanych z skalowaniem i ogólnie traci funkcje podczas skalowania. Sklepy z kv nie mają tych funkcji, więc nie ograniczają cię. Jednak funkcje te często mogą być tworzone w każdym razie, zaprojektowane z rdzenia, aby były skalowalne (ponieważ staje się natychmiast oczywiste, jeśli nie są).
Jednak nie oznacza to, że są rzeczy, których nie można zrobić. Na przykład wspomniałeś o wyszukiwaniu.Jest to pułapka wielu sklepów Kv, ponieważ są one zwykle agnostyczne dla wartości (nie zawsze prawdziwe, przykład, redis i więcej) i nie mają możliwości znalezienia tego, czego szukasz. Co gorsza, nie są zaprojektowane, aby zrobić to szybko, po prostu są naprawdę szybkie wyszukiwanie za pomocą klucza.
Jednym z rozwiązań tego problemu jest leksykograficzne sortowanie kluczy i udzielanie zapytań dotyczących zakresu. Jest to zasadniczo "daj mi wszystko między pytanie: 1 i pytanie: 5". Ten przykład jest dość bezużyteczny, ale istnieje wiele zastosowań zapytań o zakres.
Powiedziałeś, że chcesz mieć wszystkie domy powyżej 100 000 $. Gdybyś chciał móc to zrobić, utworzyłbyś indeks domów według ceny. Powiedzmy, że masz następujące domy.
house:0 -> {"color":"blue","sold":false,"city":"Stackoverville","price":500000}
house:1 -> {"color":"red","sold":true,"city":"Toronto","price":150000}
house:2 -> {"color":"beige","sold":false,"city":"Toronto","price":40000}
house:3 -> {"color":"blue","sold":false,"city":"The Blogosphere","price":110000}
W SQL można przechowywać każde pole w kolumnie, a nie wszystkie dokumenty w jednym (w tym przypadku JSON). I mógł SELECT * FROM houses WHERE price > 100000
. Wydaje się, że wszystko jest w porządku i jest eleganckie, ale jeśli nie ma indeksu, wymaga to obejrzenia każdego domu w twoim stole i sprawdzenia jego ceny, co jeśli masz kilka milionów domów, może być wolne. Więc w sklepie z kv potrzebujesz również indeksu. Główną różnicą jest to, że baza danych SQL w milczeniu zrobi powolną rzecz, gdzie sklep kv nie będzie mógł.
Jeśli nie masz zapytań o zakres, musisz umieścić indeks w jednym dokumencie, co sprawia, że jego aktualizacja jest bezpieczna i oznacza, że musisz pobrać cały indeks dla każdego zapytania, ponownie ograniczając skalowalność .
house:index:price -> [{"price":500000,"id":"0"},{"price":150000,"id":"1"},{"price":110000,"id":"3"},{"price":40000,"id":"2"}]
Ale jeśli masz pytania Range (często zwane keyscans) można utworzyć indeks takiego:
house:index:price:040000 -> 2
house:index:price:110000 -> 3
house:index:price:150000 -> 1
house:index:price:500000 -> 0
A potem można żądać kluczy między house:index:price:100000
i house:index:price::
(The: znak '' to postać po "9"), a dostaniesz [3,1,0]
, co oznacza, że wszystkie domy są droższe niż 100 000 $ (są również przydatne w kolejności). Kolejną fajną rzeczą jest to, że prawdopodobnie będą one na jednej "partycji" twojego klastra, więc to zapytanie potrwa mniej więcej tyle samo, co singe get (plus mały dodatkowy nadmiarowy transfer) lub dwa, jeśli twój zasięg się przejdzie granice serwera (ale można to zrobić równolegle!).
Pokazuje, jak wykonywać zapytania w sklepie z kv. Możesz zapytać o wszystko, co można zamówić jako ciąg (prawie wszystko) i bardzo szybko je wyszukać. Jeśli nie masz zapytań o zakres, będziesz musiał przechowywać cały indeks pod jednym kluczem, który jest do bani, ale jeśli masz zapytania o zakres, jest bardzo miły i bardzo szybki. Oto bardziej złożony przykład.
Chcę niesprzedanych domów w Toronto, które są niższe niż 100 000 USD. Po prostu muszę zaprojektować mój indeks. (Dodałem w kilku domach, aby było to bardziej znaczące). Na początku pomyślałeś, że możesz po prostu zbudować inny indeks dla każdej nieruchomości, ale szybko zrozumiesz, że to oznacza, że musisz wybrać każdy niesprzedany dom i pobrać go z bazy danych. (To właśnie miałem na myśli, gdy powiedziałem, że problemy z skalowaniem są od razu oczywiste.) Rozwiązaniem jest użycie multiindeksu. Po zbudowaniu możesz wybrać dokładnie te wartości, które chcesz.
house:index:sold:city:price:f~Fooville~000010:5 -> ""
house:index:sold:city:price:f~Toronto~040000:2 -> ""
house:index:sold:city:price:f~Toronto~140000:4 -> ""
house:index:sold:city:price:t~Stackoverville~500000:0 -> ""
house:index:sold:city:price:t~The Blogosphere~110000:3 -> ""
house:index:sold:city:price:t~Toronto~150000:1 -> ""
Teraz, w przeciwieństwie do ostatniego przykładu, umieszczam identyfikator w kluczu. Dzięki temu dwa domy mają te same właściwości. Mogłem połączyć je w wartości, ale dodanie indeksów usuwania staje się trudniejsze. Zdecydowałem się również podzielić moje dane na ~
. Dzieje się tak dlatego, że jest to leksykograficznie po wszystkich literach, zapewniając, że pełne imię i nazwisko zostanie posortowane i nie będę musiał podkładać każdego miasta na tę samą długość. W systemie produkcyjnym prawdopodobnie używałbym bajtu 255 lub 0.
Teraz zakres house:index:sold:city:price:f~Toronto~100000
- house:index:sold:city:price:f~Toronto~~
wybierze wszystkie domy pasujące do zapytania. Ważną rzeczą jest to, że kwerenda skaluje się liniowo z liczbą wyników. Oznacza to, że musisz zbudować indeks dla każdego zestawu właściwości, które chcesz indeksować (chociaż indeks w naszym przykładzie działa również w przypadku zapytań sprzedawanych i sprzedanych). To może wydawać się dużo pracy, ale w końcu zdajesz sobie sprawę, że to po prostu robisz to, a nie twoja baza danych. Jestem pewien, że zaczynamy widzieć bibliotek dla tego rodzaju rzeczy niebawem: D
Po rozciągnięciu tematu trochę, ja wykazały:
- Niektóre zastosowania sklepie kV.
- Jak wykonywać kwerendy w sklepie kv.
Myślę, że okaże się, że sklepy z kv są wystarczające dla wielu aplikacji i często zapewniają lepszą wydajność i dostępność niż tradycyjne RDMS. W związku z tym każda aplikacja jest inna i dlatego nie można odpowiedzieć na pierwotne pytanie.
Na pewno można zrobić filtry w sklepach z kluczem wartości, jeśli chcesz - zależy częściowo od wdrożenia sklepu i może na własną pomysłowość. –