Przechowywanie danych hierarchicznych w magazynie danych Google App Engine?

Może ktoś zilustrować jak Mogę przechowywać i łatwo odpytywać hierarchiczne dane w Google app engine datastore?

Author: Dan McGrath, 2009-06-18

3 answers

Najlepsza opcja zależy od twoich wymagań. Oto kilka rozwiązań (zakładam, że używasz Pythona, skoro nie podałeś):

  1. Jeśli potrzebujesz aktualizacji transakcyjnych na całym drzewie, a nie będziesz mieć więcej niż około 1QPS trwałych aktualizacji na jednym drzewie, możesz użyć wbudowanej obsługi pamięci heirarchial. Podczas tworzenia encji można przekazać atrybut" parent", aby określić encję lub klucz nadrzędny, a podczas zapytań można użyć .metoda ancestor () (lub 'ANCESTOR IS' w GQL do pobierania wszystkich potomków danego encji.
  2. Jeśli nie potrzebujesz aktualizacji transakcyjnych, możesz replikować funkcjonalność grup encji bez problemów (i bezpieczeństwa transakcji): Dodaj db. ListProperty (db.Klucz) do modelu o nazwie "ancestors" i uzupełnij go listą przodków wstawianego obiektu. Następnie można łatwo pobrać wszystko, co pochodzi od danego przodka z MyModel.wszystkie ().filter ('ancestors =', parent_key).
  3. Jeśli nie potrzebujesz transakcji, a zależy Ci tylko na pobraniu bezpośrednich potomków jednostki (Nie wszystkich potomków), użyj podejścia opisanego powyżej, ale zamiast ListProperty użyj ReferenceProperty do jednostki macierzystej. Jest to tzw. lista adiacencka.

Są dostępne inne podejścia, ale te trzy powinny obejmować najczęstsze przypadki.

 21
Author: Nick Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-18 16:02:14

Cóż, powinieneś starać się zachować swoje dane tak liniowe, jak to tylko możliwe. Jeśli chcesz szybko odpytywać strukturę drzewa danych, musisz albo przechowywać ją w bazie danych (lub kodować JSON, jeśli wolisz), jeśli jest to możliwe dla Twoich danych, albo musisz wygenerować indeksy drzew, które mogą być używane do szybkiego odpytywania fragmentu struktury drzewa. Nie jestem jednak pewien, jak Google App Engine sprawdziłby się podczas aktualizacji tych indeksów.

Jeśli chodzi o Google App Engine, twój główny problemem powinno być zmniejszenie liczby zapytań, które musisz wykonać, i aby zapytania zwracały jak najmniej wierszy. Operacje są kosztowne, ale pamięć nie jest, więc redundancja nie powinna być postrzegana jako zła rzecz.

Oto kilka przemyśleń na ten temat, które znalazłem googlując (chociaż dla MySQL, ale można z niego uzyskać ogólny pomysł): Zarządzanie danymi hierarchicznymi w MySQL

Ah I oto dyskusja na temat Google App Engine: Modelowanie hierarchiczne DANE

 2
Author: Blixt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-18 09:57:06

Jednym ze sposobów jest użycie nadrzędnego atrybutu modelu. Następnie można skorzystać z zapytania.ancestor() i model.funkcje parent ().

Myślę, że to zależy od tego, jakie operacje chcesz wykonać na tych danych, które określiłyby, jak najlepiej je reprezentować.

 0
Author: Jonathan Maddison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-18 11:08:10