Я ознакомился с этим видео о лучших практиках создания плоских баз данных с помощью firestore: Преобразование SQL структур в структуры Firebase
Я придумал что-то похожее на это:
const firestore = {
events: {
eventID: { // Doc
description: "Event Description", // Field
title: "Event Title", // Field
}
},
eventComments: { // Collection
eventID: { // Doc
comments: { // Field
commentID1: true, // Value
commentID2: true, // Value
commentID3: true, // Value
}
}
},
comments: { // Collection
commentID1: { // Doc
createdAt: "Timestamp", // Field
createdBy: "uid", // Field
content: "Comment Body" // Field
},
commentID2: {...},
commentID3: {...},
},
};
Я не уверен, что лучший способ получить соответствующие данные, однако
Я использую реаги и реаги-редуктор-пожарный магазин для доступа к данным. Моя текущая настройка приложения выглядит следующим образом
<EventsDetailPage>
<Comments>
<Comment />
<Comment />
<Comment />
</Comments>
</EventsDetailPage>
Я предложил два возможных метода ...
Метод 1
У меня есть useFirestoreConnect
в каждом компоненте. Верхний уровень получает event
и передает eventID
компоненту комментариев, компонент комментариев использует eventID
, чтобы получить список eventComments
, который передает отдельный commentID
для каждого комментария компоненту комментариев, затем наконец, отдельный компонент комментариев использует commentID
для получения соответствующих данных комментариев.
Моя проблема с этим: не означает ли это, что имеется прослушиватель для события, списка комментариев и каждого индивидуальный комментарий? Это осуждается?
EX: Это будет в событии, комментариях и компоненте комментариев, но каждый с соответствующими значениями
useFirestoreConnect(() => [
{collection: 'events', doc: eventID},
]);
const event = useSelector(({firestore: {data}}) => data.events && data.events[eventID]);
Метод 2
Допустим, у меня есть список событий, я могу сделать запрос, чтобы получить списки
useFirestoreConnect(() => [{
collection: 'events',
orderBy: ["createdAt", "desc"],
limitTo: 10
}]);
const events = useSelector(({ firestore: { ordered } }) => ordered.events);
Это здорово, потому что я считаю, что это один слушатель, но если какие-либо данные изменяются в любом из событий слушатель по-прежнему будет реагировать на изменения.
Моя проблема с этим: я не знаю, как сделать предложение where, которое бы возвращало все события для данного списка идентификаторов.
Так сказать, если я хочу получить список событий с where: ['id', '==', ['eventID1', 'eventID2', 'eventID3']]