Как лучше всего работать с реляционной моделью пожарного депо? - PullRequest
0 голосов
/ 14 апреля 2020

Я ознакомился с этим видео о лучших практиках создания плоских баз данных с помощью 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>

enter image description here

Я предложил два возможных метода ...

Метод 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']]

1 Ответ

1 голос
/ 14 апреля 2020

Чтобы получить до 10 элементов по их идентификатору, вы можете использовать in запрос :

.where('id', 'in', ['eventID1', 'eventID2', 'eventID3'])

Если у вас более 10 идентификаторов, вам придется выполнить несколько из этих запросов.

...