Возможная схема базы данных для вашего приложения:
Firestore-root
|
--- users (collection)
| |
| --- uid (document)
| |
| --- userName: "NameOfUser"
| |
| --- settings (map)
| | |
| | --- language: "en"
| | |
| | --- //Other settings properties
| |
| --- //Other user properties
|
--- cards (collection)
| |
| --- cardId (document)
| |
| --- uid: "uid"
| |
| --- //Other card properties
|
--- decks (collection)
|
--- uid (document)
|
--- userDecks (collection)
|
--- deckId (document)
|
--- deckName: "NameOfTheDeck"
|
--- //Other deck properties
|
--- userDeckCards (collection)
|
--- cardId (document)
|
--- uid: "uid"
|
--- //Other card properties
Идея в том, что у пользователя есть свои настройки (например, язык и т. Д.). Он также может создать список карт, в который он может добавить столько карт, сколько он хочет. Я хочу иметь возможность запрашивать все карты по списку карт, все списки карт по пользователю, все настройки по пользователю
Используя эту схему базы данных, вы можете просто:
Получить всех пользователей, подключив прослушиватель к users
справочнику коллекции:
db.collection("users").get().then(/* ... */);
Получите все настройки, которые соответствуют определенному пользователю, используя следующую ссылку, и выполните итерации по карте settings
:
db.collection("users").doc(uid).get().then(/* ... */);
Получить все карточки от всех пользователей, подключив прослушиватель к cards
справочнику коллекции:
db.collection("cards").get().then(/* ... */);
Получить все карты, которые соответствуют определенному пользователю, используя query
:
db.collection("cards").where("uid", "==", uid).get().then(/* ... */);
Как вы можете, нужны только две коллекции верхнего уровня. Для вашего конкретного случая использования также нет необходимости денормализовать данные, они будут масштабироваться без проблем.
Edit:
Согласно вашим комментариям, да, вам следует создать еще одну коллекцию с именем decks
, чтобы вы могли получить все колоды, которые соответствуют конкретному пользователю. Для этого требуется следующая ссылка на коллекцию:
db.collection("decks").doc(uid).collection("userDecks").get().then(/* ... */);
Если вы хотите получить все карты, которые соответствуют определенной колоде пользователя, то следующая ссылка на коллекцию обязательна:
db.collection("decks").doc(uid)
.collection("userDecks").doc(deckId)
.collection("userDeckCards")
.get().then(/* ... */);
В этом случае вам нужно использовать denormalization
. Это обычная практика, когда дело доходит до Firebase. Если вы новичок в базах данных NoQSL, я рекомендую вам посмотреть это видео, Денормализация нормальна с базой данных Firebase для лучшего понимания. Это для базы данных реального времени Firebase, но те же правила применяются к Cloud Firestore.
Кроме того, когда вы дублируете данные, следует помнить одну вещь. Точно так же, как вы добавляете данные, вы должны поддерживать их. Другими словами, если вы хотите обновить / обнаружить элемент, вы должны делать это в каждом месте, где он существует.