Klucze i grupy encji

Typy, nazwy i ID

Każda encja ma określony typ, który grupuje encje w zbiory, na których można wykonywać zapytania. W odróżnieniu od rekordów w bazie - dwie encje tego samego typu nie muszą mieć tych samych właściwości.

Każda encja posiada swój unikatowy identyfikator. Aplikacja może podać własną wartość dla takiego identyfikatora przy tworzeniu encji lub pozwolić datastore stworzyć klucz samodzielnie. By podać własny identyfikator dla encji wystarczy przekazać go w argumencie key_name konstruktora klasy modelu:

s = Story(key_name="xzy123")
Gdzie wartość key_name jest przetrzymywana jako łańcuch unikodu. Nie może zaczynać się od cyfry, lub od dwóch znakow podkreślenia.

Jeżeli key_name nie zostanie podane datastore wygeneruje własny klucz dla encji przy zapisie:

s2 = Story()    # s2 nie ma id
s2.put()        # s2 dostaje id bo jest zapisywane.

Po zapisaniu encji nie można zmienić jej ID ani nazwy. Nazwy kluczy i identyfikatory (ID) nie są właściwościami encji, lecz można wykonywać zapytania oparte na kluczach encji bazując na właściwości __key__.

Grupy encji, przodkowie i ścieżki

Każda encja należy do jakiejś grupy encji. Zgrupowane encje każą App Engine przetrzymywać je w tej samej części rozproszonej sieci.

Gdy aplikacja tworzy encję może przypisać jej inną encję jako rodzica używając argumentu parent w konstruktorze modelu. Przypisanie rodzica spowoduje że nowa encja zostanie dodana do tej samej grupy encji co rodzic.

Encja bez rodzica jest encją główną (korzeniem). Encja będąca rodzicem dla innej encji może też mieć własnego rodzica. Łańcuch encji rodziców od danej encji do głównej encji jest ścieżką encji zawierającą wszystkie encje-przodki w kolejności hierarchicznej. Rodzic encji określany jest przy jej tworzeniu i nie może być później zmieniony.

Wszystkie encje z grupy zapisywane są w tym samym węźle datastore. Pojedyncza transakcja może zmodyfikować wiele encji z danej grupy, lub dodać nowe encje do tej grupy.

Jeżeli encja rodzic zostanie skasowana to encje dzieci nadal są dostępne za pomocą ich kluczy lub za pomocą ścieżek hierarchii.

Można tworzyć encje ze ścieżką przodka (korzeniem), który nie jest encją. Wystarczy że przodek będzie miał klucz (klasa Key) stworzony za pomocą typu i nazwy klucza, który można podać encjom-dzieciom jako rodzic. Wszystkie encje o tym samym głównym przodku należą do tej samej grupy, niezależnie czy korzeń ścieżki reprezentuje realną encję.

Notka: używaj grupy encji, gdy potrzebne są do transakcji. Dla innych relacji pomiędzy encjami używaj właściwości typu ReferenceProperty i kluczy encji, których można używać w zapytaniach. Rozproszenie encji na wiele grup umożliwia datastore na lepsze rozproszenie tych encji w gałęziach bazy, co zwiększa efektywność i wydajność datastore

Unikalność kluczy i ścieżek

Pełen klucz encji zawierający ścieżkę, typ i nazwę lub numeryczne ID jest unikalny i specyficzny dla tej encji. Klucz ten jest przypisywany encji w momencie jej zapisu i nie może ulec zmianie.

Aplikacja nie powinna polegać na numerycznych ID encji przypisywanych rosnąco kolejnym encjom, gdyż nie jest zagwarantowane że np. numeracja będzie ciągła. Nie należy traktować tego jako inkrementującego się licznika.

Na podstawie Keys and Entity Groups.
RkBlog

Google App Engine (GAE), 1 August 2009

Comment article
Comment article RkBlog main page Search RSS Contact