Czy istnieje jakiś sprytny sposób na uniknięcie kosztownych zapytań z klauzulą IN w takich przypadkach, jak ten następny?Zminimuj podzapytania za pomocą zapytań IN w AppEngine (python)
Korzystam z Google App Engine do budowy aplikacji na Facebooku iw pewnym momencie (oczywiście) muszę wysłać zapytanie do magazynu danych, aby uzyskać wszystkie podmioty należące do któregokolwiek z przyjaciół Facebooka danego użytkownika.
Załóżmy, że mam kilka podmiotów modelowane jako takie:
class Thing(db.Model):
owner = db.ReferenceProperty(reference_class=User, required=True)
owner_id = db.StringProperty(required=True)
...
i
class User(db.Model):
id = db.StringProperty(required=True)
...
W pewnym momencie kwerendy Facebook, aby uzyskać listę znajomych danego użytkownika i muszę wykonać następujące zapytanie
# get all Thing instances that belong to friends
query = Thing.all()
query.filter('owner_id IN', friend_ids)
Gdybym to zrobił, AppEngine byłoby wykonać podzapytania dla każdego i d w friend_ids
, prawdopodobnie przekraczając maksymalną liczbę podkwerend, może pojawić się zapytanie (30).
Czy istnieje lepszy sposób to zrobić (tj. Minimalizując liczbę zapytań)? Rozumiem, że nie ma żadnych powiązań i łączy przy użyciu datastore, ale w szczególności, rozważyłbym dodanie nowych pól do klasy User
lub Thing
, jeśli pomaga to w ułatwianiu.
+1 Inną opcją jest sprawienie, aby obiekty potomne dla użytkownika zezwalały na zapytania przodków dotyczące określonego rodzaju rzeczy do zwrócenia. Użycie key_names ma kluczowe znaczenie dla tego naprawdę działającego. – kevpie
To wspaniale, nawet uczyniłem Rzeczy dziećmi Użytkownikiem, jak sugeruje kevpie. Miałem jednak do czynienia z jeszcze kilkoma problemami: a) Nie przechowuję encji User dla każdego friend_id, więc muszę filtrować wartości None, które otrzymuję, gdy wysyłam zapytania za pomocą get_by_key_name; b) Muszę odfiltrować rzeczy także przez inne pola, ale robię to na elementach, które pobieram po ich pobraniu z DataStore. Czy istnieje lepszy sposób na zrobienie tego? – abahgat
Pamiętaj, aby obejrzeć wypowiedzi Nicka zamieszczone w jego odpowiedzi. Możesz użyć indeksu połączonego z właściwością listy. Jest to pokazane w pierwszej rozmowie napisanej przez Nicka. – kevpie