Projektowanie bazy danych dla aplikacji rzadko jest kompletne bez tworzenia relacji między tabelami. Edytor bazy danych AppMaster umożliwia stworzenie takiej relacji jednym prostym ruchem. Wystarczy narysować linię łączącą tabele, a następnie wybrać typ relacji (jeden do jednego, jeden do wielu, wiele do wielu) i ewentualnie nazwy pól. Co jednak w sytuacji, gdy tabela musi odnosić się do samej siebie?
Przeanalizujmy sytuację, gdy konieczne jest utrzymanie pewnego dziennika rekordów. Jednocześnie jest on zorganizowany w taki sposób, że rekordy tworzone są ściśle w łańcuchu. Każdy wpis musi być powiązany z poprzednim i kolejnym (oczywiście poza pierwszym i ostatnim wpisem). W ten sposób można śledzić cały łańcuch dla każdego pojedynczego rekordu, a system otrzymuje dodatkową ochronę przed nieautoryzowanymi zmianami.
Projektowanie bazy danych
Najpierw musimy stworzyć sam model w projektancie bazy danych. Nazwijmy go Journal i dodajmy jedno pole tekstowe, record.
Kolejnym krokiem jest utworzenie połączenia. Aby to zrobić, kliknij prawym przyciskiem myszy w dowolnym miejscu na płótnie i wybierz Create relation.
Następnym krokiem jest skonfigurowanie połączenia. Aby to zrobić, musisz wybrać ten sam model co Source i Target (w tym przypadku Journal), ustawić nazwy pól (next i previous) oraz typ połączenia (has_one).
Konfiguracja tabeli samoreferencyjnej jest zakończona. Możesz rozpocząć tworzenie projektu front-end i procesów biznesowych.
Tworzenie procesu biznesowego
Utwórzmy backendowy proces biznesowy, który będzie dodawał nowe wpisy do dziennika. Otrzyma on tekst nowego wpisu jako parametr wejściowy. Wyszuka on w bazie danych najnowszy wpis, aby powiązać go z nowym wpisem. Dla wyszukiwania można ustawić _Limit = 1 (ponieważ potrzebny jest tylko jeden ostatni rekord), co wystarczy, ponieważ domyślnie rekordy będą uporządkowane według ID i wystawione w kolejności dodania ich do bazy danych, zaczynając od ostatniego rekordu.
Wynikiem wyszukiwania będzie tablica składająca się z jednego elementu. Musimy go wyodrębnić za pomocą Array Element bloku z index 0 i utworzyć nowy wpis w dzienniku (Make Journal). Ostatnim krokiem jest już tylko zapis do bazy danych (DB: Create Journal) i zakończenie procesu biznesowego.
Ten proces biznesowy może być wykorzystany dla domyślnego punktu końcowego do tworzenia nowych rekordów bazy danych.
Projekt front-endu
W przypadku front-endu aplikacji internetowej wystarczy dodać do strony trzy elementy.
- Pole tekstowe do wpisania treści nowego wpisu
- Przycisk do dodania wpisu
- Tabela do wyświetlania wszystkich wpisów.
Dla przycisku "ADD Journal Record" należy również stworzyć prosty proces biznesowy. Po kliknięciu przycisku tekst z pola wejściowego powinien zostać wysłany do endpointa w celu utworzenia nowych wpisów, a kolejny przycisk do kliknięcia w celu aktualizacji zawartości tabeli jako ostatnia akcja.
Dla samej tabeli warto też ustawić procesy biznesowe, ale w tej lekcji nie będziemy się nad tym rozwodzić. Wszystkie niezbędne informacje znajdziesz w lekcji poświęconej ustawianiu tabel. Warto jedynie zwrócić uwagę, że przy pobieraniu danych należy określić m.in. _with parametr, aby uzyskać dane z powiązanych tabel (mimo że w naszym przypadku tabela jest powiązana sama ze sobą).
Możemy opublikować aplikację, dodać kilka wpisów i sprawdzić, czy wszystko działa poprawnie. Każdy wpis jest tak naprawdę powiązany z wpisami w tej samej tabeli. Na przykład dla wpisu o ID 3 istnieje powiązanie z poprzednim wpisem (ID 2) i następnym wpisem (ID 4).