Globale to miecze skarbów do przechowywania danych. Drzewa. Część 2

Globale to miecze skarbów do przechowywania danych. Drzewa. Część 2Pierwsze kroki – zobacz część 1.

3. Warianty konstrukcji przy użyciu globali

Struktura taka jak uporządkowane drzewo ma różne przypadki specjalne. Rozważmy te, które mają praktyczną wartość podczas pracy z globalami.

3.1 Przypadek szczególny 1. Jeden węzeł bez rozgałęzień


Globale to miecze skarbów do przechowywania danych. Drzewa. Część 2Wartości globalnych można używać nie tylko jak tablicy, ale także jak zwykłych zmiennych. Na przykład jako licznik:

Set ^counter = 0  ; установка счётчика
Set id=$Increment(^counter) ;  атомарное инкрементирование

W tym przypadku global, oprócz swojego znaczenia, może mieć również gałęzie. Jedno drugiego nie wyklucza.

3.2 Przypadek szczególny 2. Jeden wierzchołek i wiele gałęzi

Ogólnie rzecz biorąc, jest to klasyczna baza klucz-wartość. A jeśli zapiszemy krotkę wartości jako wartość, otrzymamy bardzo zwyczajną tabelę z kluczem podstawowym.

Globale to miecze skarbów do przechowywania danych. Drzewa. Część 2

Aby zaimplementować tabelę na elementach globalnych, będziemy musieli sami wygenerować wiersze na podstawie wartości kolumn, a następnie zapisać je w pliku globalnym przy użyciu klucza podstawowego. Aby umożliwić ponowne podzielenie ciągu na kolumny podczas czytania, możesz użyć:

  1. znaki ogranicznika.
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. sztywny schemat, w którym każde pole zajmuje określoną liczbę bajtów. Podobnie jak w relacyjnych bazach danych.
  3. specjalna funkcja $LB (dostępna w Cache), która tworzy ciąg wartości.
    Set ^t(id1) = $LB("col11", "col21", "col31")
    Set ^t(id2) = $LB("col12", "col22", "col32")

Co ciekawe, użycie globali do zrobienia czegoś podobnego do indeksów wtórnych w relacyjnych bazach danych nie jest trudne. Nazwijmy takie struktury indeksami globalnymi. Indeks globalny jest drzewem pomocniczym umożliwiającym szybkie wyszukiwanie pól, które nie są częścią klucza podstawowego głównego globala. Aby go wypełnić i wykorzystać, należy napisać dodatkowy kod.

Utwórzmy indeks globalny w pierwszej kolumnie.

Set ^i("col11", id1) = 1
Set ^i("col12", id2) = 1

Teraz, aby szybko wyszukać informacje w pierwszej kolumnie, musimy zajrzeć do świata ^i i znajdź klucze podstawowe (id) odpowiadające żądanej wartości pierwszej kolumny.

Wstawiając wartość, możemy od razu utworzyć globale wartości i indeksu dla wymaganych pól. A dla pewności zamknijmy to wszystko w transakcji.

TSTART
Set ^t(id1) = $LB("col11", "col21", "col31")
Set ^i("col11", id1) = 1
TCOMMIT

Szczegóły jak to zrobić na M tabele na globalach, emulacja indeksów wtórnych.

Takie tabele będą działać równie szybko, jak w tradycyjnych bazach danych (lub nawet szybciej), jeśli funkcje wstawiania/aktualizacji/usuwania wierszy zostaną napisane w COS/M i skompilowane.Sprawdziłem to stwierdzenie testami zbiorczymi INSERT i SELECT w jedną dwukolumnową tabelę, łącznie z użyciem poleceń TSTART i TCOMMIT (transakcje).

Nie testowałem bardziej złożonych scenariuszy z jednoczesnym dostępem i transakcjami równoległymi.

Bez transakcji współczynnik wstawiania wyniósł 778 361 wstawek na sekundę na milion wartości.
Przy 300 milionach wartości - 422 141 wstawek/sekundę.

Podczas korzystania z transakcji - 572 082 wstawek/sekundę dla 50M wstawek. Wszystkie operacje wykonano ze skompilowanego kodu M.
Dyski twarde są zwykłe, a nie SSD. RAID5 z funkcją zapisu zwrotnego. Procesor Phenom II 1100T.

Aby w podobny sposób przetestować bazę danych SQL, należy napisać procedurę składowaną, która wykona operacje wstawiania w pętli. Podczas testowania MySQL 5.5 (pamięć InnoDB) przy użyciu tej metody otrzymałem liczby nie większe niż 11 tys. wstawień na sekundę.
Tak, implementacja tabel w globalach wygląda na bardziej złożoną niż w relacyjnych bazach danych. Dlatego przemysłowe bazy danych na globalach mają dostęp SQL, aby uprościć pracę z danymi tabelarycznymi.

Globale to miecze skarbów do przechowywania danych. Drzewa. Część 2Ogólnie rzecz biorąc, jeśli schemat danych nie będzie się często zmieniał, szybkość wstawiania nie jest krytyczna, a całą bazę danych można łatwo przedstawić w postaci znormalizowanych tabel, wówczas łatwiej jest pracować z SQL, ponieważ zapewnia wyższy poziom abstrakcji .

Globale to miecze skarbów do przechowywania danych. Drzewa. Część 2W tym konkretnym przypadku chciałem to pokazać globals może działać jako konstruktor do tworzenia innych baz danych. Podobnie jak asembler, w którym można pisać w innych językach. Oto przykłady tego, jak można tworzyć analogi na globalach klucz-wartość, listy, zestawy, tabelaryczne, zorientowane na dokumenty bazy danych.

Jeśli chcesz stworzyć jakąś niestandardową bazę danych przy minimalnym wysiłku, powinieneś zwrócić uwagę na bazy globalne.

3.3 Przypadek szczególny 3. Drzewo dwupoziomowe, każdy węzeł drugiego poziomu ma stałą liczbę gałęzi

Globale to miecze skarbów do przechowywania danych. Drzewa. Część 2Prawdopodobnie zgadłeś: jest to alternatywna implementacja tabel na globalach. Porównajmy tę implementację z poprzednią.

Tabele na drzewie dwupoziomowym vs. na drzewie jednopoziomowym.

Wady
Plusy

  1. Wolniejsze wstawianie, ponieważ należy ustawić liczbę węzłów równą liczbie kolumn.
  2. Większe zużycie miejsca na dysku. Ponieważ indeksy globalne (rozumiane jako indeksy tablic) z nazwami kolumn zajmują miejsce na dysku i są duplikowane dla każdego wiersza.

  1. Szybszy dostęp do wartości poszczególnych kolumn, ponieważ nie ma potrzeby analizowania ciągu. Według moich testów jest o 11,5% szybszy na 2 kolumnach i więcej na większej liczbie kolumn.
  2. Łatwiej zmienić schemat danych
  3. Bardziej przejrzysty kod

Wnioski: nie dla każdego. Ponieważ szybkość jest jedną z najważniejszych zalet globali, nie ma sensu używać tej implementacji, ponieważ najprawdopodobniej nie będzie ona działać szybciej niż tabele w relacyjnych bazach danych.

3.4 Przypadek ogólny. Drzewa i uporządkowane drzewa

Każda struktura danych, którą można przedstawić w postaci drzewa, doskonale pasuje do struktur globalnych.

3.4.1 Obiekty z podobiektami

Globale to miecze skarbów do przechowywania danych. Drzewa. Część 2

Jest to obszar tradycyjnego użycia globali. W medycynie istnieje ogromna liczba chorób, leków, objawów i metod leczenia. Tworzenie tabeli z milionem pól dla każdego pacjenta jest irracjonalne. Co więcej, 99% pól będzie pustych.

Wyobraźmy sobie bazę danych SQL zawierającą tabele: „pacjent” ~ 100 000 pól, „Medycyna” – 100 000 pól, „Terapia” – 100 000 pól, „Powikłania” – 100 000 pól itp. i tak dalej. Możesz też stworzyć bazę danych zawierającą wiele tysięcy tabel, każda dla określonego typu pacjenta (i mogą się na siebie nakładać!), zabiegów, leków i tysięcy innych tabel w celu powiązania między tymi tabelami.

Globale są idealne dla medycyny, ponieważ pozwalają stworzyć dla każdego pacjenta dokładny opis jego historii medycznej, różnych terapii i działania leków w formie drzewa, bez marnowania dodatkowego miejsca na dysku na puste kolumny, jak miałoby to miejsce tak właśnie będzie w przypadku relacyjnym.

Globale to miecze skarbów do przechowywania danych. Drzewa. Część 2Korzystając z globali, wygodnie jest stworzyć bazę danych z danymi o ludziach, gdy ważne jest zgromadzenie i usystematyzowanie maksymalnie różnorodnych informacji o kliencie. Jest to poszukiwane w medycynie, bankowości, marketingu, archiwizacji i innych obszarach

.
Oczywiście w SQL można również emulować drzewo z kilkoma tabelami (rozszerzenie EAV, 1,2,3,4,5,6,7,8,9,10), jednak jest to znacznie bardziej skomplikowane i wolniejsze. Zasadniczo musiałbyś napisać global, który działa na tabelach i ukryć całą pracę z tabelami pod warstwą abstrakcji. Błędem jest emulowanie technologii niższego poziomu (globalistów) przy użyciu technologii wyższego poziomu (SQL). Nieodpowiedni.

Nie jest tajemnicą, że zmiana schematu danych w gigantycznych tabelach (ALTER TABLE) może zająć sporo czasu. Na przykład MySQL wykonuje ALTER TABLE ADD|DROP COLUMN, całkowicie kopiując informacje ze starej tabeli do nowej tabeli (testowane silniki MyISAM, InnoDB). Co może zawiesić działającą bazę danych zawierającą miliardy rekordów na dni, jeśli nie tygodnie.

Globale to miecze skarbów do przechowywania danych. Drzewa. Część 2Zmiana struktury danych, jeśli używamy globali, nic nas nie kosztuje. W dowolnym momencie możemy dodać dowolne nowe właściwości do dowolnego obiektu, na dowolnym poziomie hierarchii. Zmiany związane ze zmianą nazw oddziałów można uruchamiać w tle na działającej bazie danych.


Dlatego jeśli chodzi o przechowywanie obiektów z ogromną liczbą opcjonalnych właściwości, globale są doskonałym wyborem.

Co więcej, przypominam, że dostęp do dowolnej właściwości jest natychmiastowy, ponieważ w globalu wszystkie ścieżki są drzewami B.

Ogólnie rzecz biorąc, globalne bazy danych są rodzajem baz danych zorientowanych na dokumenty, z możliwością przechowywania informacji hierarchicznych. Tym samym bazy dokumentowe mogą konkurować z globalami w zakresie przechowywania dokumentacji medycznej. Ale to wciąż nie to samoDla porównania weźmy MongoDB. W tej domenie przegrywa z globalami z następujących powodów:

  1. Rozmiar dokumentu. Jednostka pamięci to tekst w formacie JSON (dokładniej BSON) o maksymalnej objętości około 16 MB. Ograniczenie wprowadzono specjalnie po to, aby baza danych JSON nie zwalniała podczas analizowania, jeśli przechowywany jest w niej duży dokument JSON, a następnie uzyskuje się do niego dostęp za pomocą pól. Dokument ten powinien zawierać wszystkie informacje o pacjencie. Wszyscy wiemy, jak obszerna może być dokumentacja pacjentów. Maksymalny rozmiar karty wynoszący 16 MB natychmiast kładzie kres pacjentom, których karta chorobowa zawiera pliki MRI, zdjęcia RTG i inne badania. W jednym oddziale globalnym można mieć gigabajty i terabajty informacji. W zasadzie możemy na tym zakończyć, ale będę kontynuował.
  2. Czas świadomości/zmiany/usunięcia nowych właściwości w karcie pacjenta. Taka baza danych musi wczytać całą mapę do pamięci (jest to ogromna ilość!), przeanalizować BSON, dodać/zmienić/usunąć nowy węzeł, zaktualizować indeksy, spakować do BSON i zapisać na dysku. Global musi jedynie uzyskać dostęp do określonej właściwości i manipulować nią.
  3. Szybki dostęp do poszczególnych nieruchomości. Przy dużej liczbie właściwości w dokumencie i jego wielopoziomowej strukturze dostęp do poszczególnych właściwości będzie szybszy ze względu na fakt, że każda ścieżka w globalu jest drzewem B. W BSON musisz liniowo przeanalizować dokument, aby znaleźć żądaną właściwość.

3.3.2 Tablice asocjacyjne

Tablice asocjacyjne (nawet z tablicami zagnieżdżonymi) idealnie pasują do obiektów globalnych. Przykładowo taka tablica z PHP zostanie wyświetlona na pierwszym obrazku 3.3.1.

$a = array(
  "name" => "Vince Medvedev",
  "city" => "Moscow",
  "threatments" => array(
    "surgeries" => array("apedicectomy", "biopsy"),
    "radiation" => array("gamma", "x-rays"),
    "physiotherapy" => array("knee", "shoulder")
  )
);

3.3.3 Dokumenty hierarchiczne: XML, JSON

Można je również łatwo przechowywać w plikach globalnych. Można je układać na różne sposoby do przechowywania.

XML
Najłatwiejszym sposobem rozłożenia XML na elementy globalne jest przechowywanie atrybutów znaczników w węzłach. A jeśli potrzebny jest szybki dostęp do atrybutów tagów, to możemy je przenieść do osobnych gałęzi.

Globale to miecze skarbów do przechowywania danych. Drzewa. Część 2

<note id=5>
<to>Вася</to>
<from>Света</from>
<heading>Напоминание</heading>
<body>Позвони мне завтра!</body>
</note>

W COS odpowiadałoby to kodowi:

Set ^xml("note")="id=5"
Set ^xml("note","to")="Саша"
Set ^xml("note","from")="Света"
Set ^xml("note","heading")="Напоминание"
Set ^xml("note","body")="Позвони мне завтра!"

Uwaga: W przypadku tablic XML, JSON i asocjacyjnych można wymyślić wiele różnych sposobów wyświetlania na elementach globalnych. W tym przypadku nie odzwierciedliliśmy kolejności subtagów w tagu notatki. Globalnie ^xml podtagi będą wyświetlane w kolejności alfabetycznej. Aby ściśle odzwierciedlić kolejność, można zastosować np. następujący wyświetlacz:

Globale to miecze skarbów do przechowywania danych. Drzewa. Część 2
JSON.
Pierwszy obraz z sekcji 3.3.1 przedstawia odzwierciedlenie tego dokumentu JSON:

var document = {
  "name": "Vince Medvedev",
  "city": "Moscow",
  "threatments": {
    "surgeries": ["apedicectomy", "biopsy"],
    "radiation": ["gamma", "x-rays"],
    "physiotherapy": ["knee", "shoulder"]
  },
};

3.3.4 Identyczne struktury połączone relacjami hierarchicznymi

Przykłady: struktura biur sprzedaży, lokalizacja osób w strukturze MLM, baza danych o debiutach w szachach.

Baza debiutów. Możesz użyć oszacowania siły skoku jako wartości indeksu węzła globalnego. Następnie, aby wybrać najsilniejszy ruch, wystarczy wybrać gałąź o największej wadze. W trybie globalnym wszystkie gałęzie na każdym poziomie zostaną posortowane według siły ruchu.

Globale to miecze skarbów do przechowywania danych. Drzewa. Część 2

Struktura biur sprzedaży, struktura ludzi w MLM. Węzły mogą przechowywać określone wartości buforowania, które odzwierciedlają charakterystykę całego poddrzewa. Na przykład wielkość sprzedaży danego poddrzewa. W każdej chwili możemy uzyskać liczbę odzwierciedlającą osiągnięcia dowolnej branży.

Globale to miecze skarbów do przechowywania danych. Drzewa. Część 2

4. W jakich przypadkach najkorzystniej jest używać globali?

Pierwsza kolumna przedstawia przypadki, w których uzyskasz znaczny przyrost prędkości dzięki zastosowaniu globali, a druga, gdy projekt lub model danych zostanie uproszczony.

prędkość
Łatwość przetwarzania/prezentowania danych

  1. Wstawianie [z automatycznym sortowaniem na każdym poziomie], [indeksowanie według klucza głównego]
  2. Usuwanie poddrzew
  3. Obiekty z wieloma zagnieżdżonymi właściwościami, które wymagają indywidualnego dostępu
  4. Hierarchiczna struktura z możliwością ominięcia gałęzi podrzędnych z dowolnej gałęzi, nawet nieistniejącej
  5. Przechodzenie poddrzew w pierwszej kolejności w głąb
  1. Obiekty/elementy z ogromną liczbą opcjonalnych [i/lub zagnieżdżonych] właściwości/elementów
  2. Dane bez schematu. Kiedy często mogą pojawiać się nowe właściwości, a stare znikają.
  3. Musisz utworzyć niestandardową bazę danych.
  4. Bazy ścieżek i drzewa decyzyjne. Kiedy wygodnie jest przedstawić ścieżki jako drzewo.
  5. Usuwanie struktur hierarchicznych bez użycia rekurencji

Rozbudowa „Globałowie to miecze skarbów do przechowywania danych. Rzadkie tablice. Część 3”.

Odpowiedzialność: Niniejszy artykuł i moje komentarze do niego są moją opinią i nie mają związku z oficjalnym stanowiskiem InterSystems Corporation.

Źródło: www.habr.com

Dodaj komentarz