Wątek przeniesiony 2024-03-10 14:17 z Webmastering przez Riddle.

Jak przechowywać drzewo w bazie danych

0

Hej w mojej aplikacji React mam dane zagniezdzone dane (nazwijmy to kiazką z rozdziałami) ktore w bazie wygladaja jak nizej (postgresql)

screenshot-20240310132039.png

Używam ich w moim komponencie draggable-tree gdzie mogę je sobie swobodnie usuwać, dodawać, zagniezdzac i zmieniać kolejność. Zagniezdzanie odbywa sie poprzez updateowanie parentId. W chwili obecnej sortowanie odbywa sie zgodnie z kolejnoscia w jakiej dane zostaly zaladowane. Mniej wiecej dziala to tak:

  • zaladuj cale dane - kazdy element ma dodatkowo relacje do np. komentarzy, opinii, historii edycji (jak zmieniala sie wartosc content w czasie) takze jesli drzewo sie rozrosnie to troche tych danych jest ladowane (nie znam sie na bazach wiec nie wiem jak np. pobieranie/zapisywanie 40 artukyłów gdzie kazdy z nich ma 3 strony tekstu + 10 komentarzy moze byc czasochlonne)
  • stworz drzewko i edytuj je w React (dodaj elementy, przenies itp)
  • nowo otrzymane drzewo zapisz do bazy co automatycznie usuwa poprzednie dane

Ogolnie chce moc wykonac 3 operacje:

  • dodawanie/usuwanie rozdzialu - tutaj moglbym po prostu zapisac nowy rozdzial w bazie rozdziałów (lub usunac). To nie ingeruje w pozostale rozdzialy wiec nie ma potrzeby zapisywania reszty
  • edytowanie obecnych rozdziałów - jak wyzej, wystarczyloby zupdateowac konkretny rozdzial w bazie
  • przenoszenie rozdziałów - to jest glowny powod dla ktorego obecnie zapisuje od razu cale drzewo. Alternatywa byloby sortowanie drzewa po contentId. Czyli jesli mam np. rozdzial 1, rozdzial 2 i rozdzial 3 z id odpowiednio 1, 2, 3, to jesli chcialbym przenies rozdzial 1 do srodka to moglbym ustawic jego contentId na srednia z id rozdziałów pomiedzy nim (czyli rozdzialu 2 i 3 czyli 2.5). Wtedy znowu nie musialbym ingerowac w pozostale rozdzialy.

Czy powyzsze ma sens czy sa lepsze metody?

0

W jakiej bazie?

1

A potrzebujesz pobierać z bazy część drzewa, czy zawsze w całości?
Bo jeśli w całości, to nie widzę powodu, dla którego miałbyś się bawić w tabelaryzowanie danych, zamiast po prostu wrzucić do bazy JSONa. W postgresie jest nawet typ JSONB do tego.

A jeśli potrzebujesz to ustrukturyzowac w tabeli, to wytłumacz, dlaczego id miałby się zmieniac.
Jeśli wstawisz rekord z autoincrementowanym id, to dostanie swój własny id i do końca świata się to nie zmieni.

0

Dodaj pole "isNew" i pola które zostały zmienione albo dodane ustawiasz na true i na tej podstawie robisz zapis do bazy.

0

@Adin @Fac @bagietMajster @some_ONE zaktualizowalem moje pytanie, bede wdzieczny za rady

0

Id nie służy do sortowania, lecz do odwoływania się do elementu. Dorzuc sobie kolumnę/parametr, w którym będziesz trzymac kolejność elementu w ramach danej gałęzi

0
Fac napisał(a):

Id nie służy do sortowania, lecz do odwoływania się do elementu. Dorzuc sobie kolumnę/parametr, w którym będziesz trzymac kolejność elementu w ramach danej gałęzi

tak dlatego sortuje po contentId (number) a nie po id ktore jest UUID

2
Tuptuś Tupta napisał(a):
Fac napisał(a):

Id nie służy do sortowania, lecz do odwoływania się do elementu. Dorzuc sobie kolumnę/parametr, w którym będziesz trzymac kolejność elementu w ramach danej gałęzi

tak dlatego sortuje po contentId (number) a nie po id ktore jest UUID

No to w parentid trzymaj id, a nie contentid rodzica. Wtedy zmiana contentid rodzica nie wpływa na powiązanie dziecka z rodzicem

0
Fac napisał(a):
Tuptuś Tupta napisał(a):
Fac napisał(a):

Id nie służy do sortowania, lecz do odwoływania się do elementu. Dorzuc sobie kolumnę/parametr, w którym będziesz trzymac kolejność elementu w ramach danej gałęzi

tak dlatego sortuje po contentId (number) a nie po id ktore jest UUID

No to w parentid trzymaj id, a nie contentid rodzica. Wtedy zmiana contentid rodzica nie wpływa na powiązanie dziecka z rodzicem

Racja, dzieki :)

1

W książce "Antywzorce języka SQL" Billa Karwina jest cały rozdział opisujący w jaki sposób poprawnie przechowywać drzewa w bazach relacyjnych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1