Jestem bardzo nowy w Cloud Firestore, więc pomóż mi. Tworzę aplikację dla nastolatków, w której chcę wyświetlić listę bardzo fajnych lokalizacji w każdym mieście. Chcę również, aby każdy użytkownik mógł zapisać dowolną lokalizację w ulubionej sekcji, aby mógł pokazać tę listę lokalizacji swoim znajomym.

Moje rzeczywiste dane:

  • db -> użytkownicy (wszyscy użytkownicy)
  • db -> lokalizacje (wszystkie lokalizacje)

Mój problem:

Chcę znaleźć sposób, aby ustawić lokalizację użytkownika jako ulubioną. Zastanawiam się nad stworzeniem nowej sekcji pod każdym użytkownikiem, aby pomieścić każdą ulubioną lokalizację, taką jak:

  • db -> użytkownicy (wszyscy użytkownicy) -> ulubione

Moje pytanie:

Jak nawiązać połączenie między jednym użytkownikiem a ulubioną lokalizacją/lokalizacją? Myślę, że jest to relacja jeden (użytkownik) do wielu. Jakie jest najlepsze rozwiązanie, aby to zrobić?

Każdy pomysł lub fragment kodu zostanie doceniony!

2
Oleg Caralanski 1 listopad 2018, 13:39

1 odpowiedź

Najlepsza odpowiedź

Jakie jest najlepsze rozwiązanie, aby to zrobić?

Wiem, że każdy szuka najlepszego rozwiązania, ale w krainie baz danych NoSQL nie ma nie najlepszego rozwiązania. Istnieje wiele sposobów modelowania bazy danych dla aplikacji takiej jak Twoja i uzyskania tego samego rezultatu. Pokażę Ci dlaczego. Przedtem spójrz na moją odpowiedź z tego post, aby lepiej zrozumieć pojęcie "idealnego", "najlepszego" lub "poprawnego" rozwiązania w przypadku Baza danych NoSQL.

Najlepszym rozwiązaniem jest, żartuję :) Zalecanym sposobem, w jaki możesz osiągnąć tę listę ulubionych funkcji, której szukasz, jest użycie arrays. Twój schemat bazy danych może wyglądać tak:

Firestore-root
   |
   --- users (Collection)
   |     |
   |     --- uid (document)
   |           |
   |           --- favoriteLocations: ["favoriteLocationId", "favoriteLocationId"]
   |
   --- locations (Collection)
         |
         --- locationId (document)
               |
               --- //Location details

Jak widać, tablica favoriteLocations zawiera tylko identyfikatory lokalizacji. Aby uzyskać szczegółowe informacje o lokalizacji, powinieneś uzyskać te identyfikatory i wykonać dodatkowe wywołanie bazy danych get().

Innym podejściem byłoby, zamiast przechowywania tablicy identyfikatorów lokalizacji, przechowywanie tablicy map lub tablicy obiektów lokalizacji. Ta opcja działa dobrze, jeśli masz rozsądną liczbę ulubionych lokalizacji, powiedzmy 5, 10 lub nawet 50, ale nie 500. Jeśli musisz przechowywać 500 lokalizacji, z jakiego powodu będziesz zapisać lokalizację jako ulubioną?

Ważną rzeczą do zapamiętania w tym przypadku jest to, że dokumenty mają ograniczenia. Istnieją więc pewne ograniczenia, jeśli chodzi o ilość danych, które można umieścić w dokumencie. Zgodnie z oficjalną dokumentacją dotyczącą użytkowania i ograniczeń:

Maksymalny rozmiar dokumentu: 1 MiB (1048576 bajtów)

Jak widać, jesteś ograniczony do 1 suma MIB danych w jednym dokumencie. Kiedy rozmawiamy o przechowywaniu tekstu, możesz przechowywać całkiem dużo, ale większe, bądź większy, uważaj na ten ograniczenie.

Jeśli chcesz przechowywać więcej danych, niż pozwala na to pojedynczy dokument, powinieneś użyć kolekcji. W ten sposób możesz utworzyć podkolekcję pod każdym obiektem użytkownika, która będzie przechowywana jako dokumenty, obiekty lokalizacji. Twoja struktura bazy danych powinna wyglądać mniej więcej tak:

Firestore-root
   |
   --- users (Collection)
   |     |
   |     --- uid (document)
   |           |
   |           --- favoriteLocations (Collection)
   |                |
   |                --- favoriteLocationId (document)
   |                       |
   |                       --- //Location details
   |
   --- locations (Collection)
         |
         --- locationId (document)
               |
               --- //Location details

Aby wysłać zapytanie do bazy danych, która wygląda tak, użyj następujących wierszy kodu:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference favoriteLocationsRef = rootRef.collection("users").document(uid).collection(favoriteLocations);
favoriteLocationsRef.get(/* ... */);

Innym podejściem byłoby zdenomalizowanie danych i utworzenie podkolekcji favoriteLocations jako kolekcji najwyższego poziomu, takiej jak ta:

Firestore-root
   |
   --- users (Collection)
   |     |
   |     --- uid (document)
   |           |
   |           --- //User details
   |
   --- locations (Collection)
   |     |
   |     --- locationId (document)
   |           |
   |           --- //Location details
   |
   --- favoriteLocations (Collection)
         |
         --- uid (document)
              |
              --- userFavoriteLocations (collection)
                    |
                    --- favoriteLocationId (document)
                           |
                           --- //Location details

Odpowiednie zapytanie powinno wyglądać tak:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference favoriteLocationsRef = rootRef.collection("favoriteLocations").document(uid).collection(userFavoriteLocations);
favoriteLocationsRef.get(/* ... */);

Lub jeszcze prostszy sposób byłby taki:

Firestore-root
   |
   --- users (Collection)
   |     |
   |     --- uid (document)
   |           |
   |           --- //User details
   |
   --- locations (Collection)
   |     |
   |     --- locationId (document)
   |           |
   |           --- //Location details
   |
   --- favoriteLocations (Collection)
         |
         --- locationId (document)
               |
               --- uid: "uid"
               |
               --- //Other location details

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query query = rootRef.collection("favoriteLocations").whereEqualTo("uid", uid);
favoriteLocationsRef.get(/* ... */);

Jak widać, dodałem uid użytkownika jako właściwość obiektu lokalizacji, dzięki czemu można po prostu uzyskać wszystkie ulubione lokalizacje danego użytkownika.

Od Ciebie zależy, które rozwiązanie będzie „najlepsze” dla przypadku użycia Twojej aplikacji :)

PS Proszę również zapoznać się z moją odpowiedzią z tego postu gdzie wyjaśniłem więcej o collections, maps i arrays w Firestore.

2
Alex Mamo 1 listopad 2018, 14:37