2015-03-08 14 views
5

Załóżmy, że chcesz przechowywać "tagi" na swoim obiekcie (powiedzmy post). Z wydaniem 9.4 masz 3 główne opcje:Czy JSONB sprawia, że ​​tablice PostgreSQL są bezużyteczne?

  • tagów jak tekst []
  • tagów jak jsonb
  • tagów tekstu (i przechowywać ciąg JSON jako tekst)

W wielu sprawy trzecie nie byłyby wykluczone, ponieważ nie pozwalałyby na warunkowanie zapytania wartością "znaczników". W moim obecnym rozwoju nie potrzebuję takich zapytań, tagi są tam tylko wyświetlane na liście postów, a nie filtrować posty.

Tak więc wybór jest najczęściej pomiędzy text[] i jsonb. Oba można zapytać.
Co byś użył? I dlaczego?

+3

http://www.databasesup.com/2015/01/tag-all-things-part-2.html –

+0

ładny link. Mam swoją odpowiedź: jestem zaskoczony, jak szybki jest JSONB, ale nadal ARRAY wykonuje zwykle lepiej. dzięki. – comte

Odpowiedz

4

W większości przypadków będzie używać normalized schema ze stołem option_tag realizującego wiele do wielu relacji między tabelami option i tag. implementacja referencyjna tutaj:

To nie może być najszybszym rozwiązaniem pod każdym względem, ale oferuje pełen zakres funkcjonalności DB, w tym integralność referencyjna, ograniczeń, pełnego zakresu typów danych , wszystkie opcje indeksu i tanie aktualizacje.

Dla uzupełnienia należy dodać do swojej listy opcji:

  • hstore (dobra opcja)
  • xml bardziej gadatliwy i bardziej skomplikowane niż albo hstore lub jsonb, więc chciałbym go używać tylko podczas pracy z XML .
  • „ciąg wartości oddzielonych przecinkami” (bardzo proste, głównie złe opcji)
  • EAV (Entity-Atrybut-Value) lub „par nazwa-wartość” (głównie złe opcja)
    Szczegóły pod tym powiązane pytanie na dba.SE:

Jeżeli lista jest tylko do wyświetlania i rzadko aktualizowane, uważam zwykły tablicę, która jest zazwyczaj mniejsze i lepiej wykonuje to niż reszta.

Przeczytaj blog entry by Josh Berkus @a_horse połączony z w swoim komentarzu. Należy jednak pamiętać, że koncentruje się na wybranych przypadkach odczytu. Josh przyznaje:

Zdaję sobie sprawę, że nie testowałem szybkości zapisu porównawczego.

I to jest miejsce, w którym znormalizowane podejście wygrywa duże, zwłaszcza gdy zmienia się pojedyncze znaczniki dużo przy równoczesnym obciążeniu.

jsonb to tylko dobra opcja, jeśli zamierzasz pracować z JSON i tak możesz przechowywać i odzyskiwać JSON "tak jak jest".

+0

znormalizowany schemat to nie moje kubki herbaty: dodaje dwie tabele, potrzebuje połączyć, aby wykonać żądania, ale przede wszystkim dane fragmentów. Myślę, że właśnie dlatego zaimplementowano tablice: jeden obiekt, jedna tabela. również moim zdaniem jest to, że większość "znormalizowanych schematów" musi być zaimplementowana w aplikacji, w przeciwnym razie masz problem z aplikacją. dlaczego mówisz "jsonb jest tylko dobrym rozwiązaniem, jeśli masz zamiar działać z JSON?" tak jest, ale jsonb ma jedną wielką zaletę: elastyczność. – comte

+1

Jeśli cokolwiek wybierania niestandardowych typów danych, takich jak JSONB, nie zapewnia elastyczności. Będziesz ograniczony przez to, z jakich bibliotek baz danych/ORM możesz korzystać, ponieważ większość nie obsługuje takich kolekcji jak typy danych. –

+1

dlatego właśnie zyski ORM są (moim zdaniem) wątpliwe. Nie jesteś pewien, co zyskujesz w prostocie, co jest warte utraty elastyczności. Są opóźnione w rozwoju DB, mają (mały) koszt, aby dostać się do środka. Ale jest to jednak osobisty widok. – comte

1

Użyłem zarówno znormalizowanego schematu, jak i zwykłego pola text z oddzielonymi wartościami CSV zamiast niestandardowymi typami danych (zamiast CSV można użyć JSON lub dowolnego innego kodowania, np. Www-urlencoding lub nawet kodowania atrybutów XML). Dzieje się tak dlatego, że wiele bibliotek ORM i baz danych nie jest zbyt dobrych w obsłudze niestandardowych typów danych (hstore, jsonb, array itd.).

@ErwinBrandstetter pominął kilka innych zalet znormalizowanego polegający na tym, że znacznie szybciej jest wyszukiwać wszystkie możliwe wcześniej używane znaczniki w znormalizowanym schemacie niż opcja tablicowa. Jest to bardzo powszechny scenariusz w wielu systemach znaczników.

Mimo to polecam użycie Solr (lub elasticsearch) do sprawdzania tagów, ponieważ zajmuje się on zliczaniem znaczników i ogólnym prefiksem znacznika znacznie lepiej niż to, co mógłbym zrobić, jeśli chciałbyś poradzić sobie z aspektami spójności. synchronizacji z wyszukiwarką. W ten sposób przechowywanie znaczników staje się mniej ważne.

+0

Na pewno brakowało mi większości zalet i wad, ponieważ jest to ogromny temat i właśnie nazwałam kilka ważnych funkcji. Dodałeś więcej, obsługa ORM prawdopodobnie jest ważna dla wielu ... –

Powiązane problemy