Сложная модель данных для Firestore

Я создаю свое первое приложение с помощью Firestore + angularfire, и определить модель данных довольно сложно из-за отсутствия у меня опыта работы с Firestore. Мне нужна ваша помощь.

У меня есть следующие сущности и зависимости.

  1. Рестораны: они независимы и могут быть зарегистрированы пользователями приложения.
  2. Пользователь, который создает ресторан, становится "владельцем". Он / она может приглашать других пользователей быть "официантами / официантками" ресторана.
  3. Пользователи могут получить приглашение "быть моим официантом / официанткой" в одном или нескольких ресторанах (возможно, от разных владельцев).
  4. У нас есть еще один объект "Клиенты". Записи этой организации содержат данные о заказанных блюдах и напитках, цене, советах и ​​т. Д.

А потом следующие правила

  1. Каждый владелец может видеть любые данные "Клиента" в своих ресторанах, но не в других ресторанах.
  2. Каждый "официант / официантка" может видеть данные клиентов, которых он / она обслуживал (в любом ресторане), но не других клиентов.

Итак, как вы можете видеть, существует несколько зависимостей, в том числе несколько условий ИЛИ, которые не поддерживаются фильтрами "где" в Firestore. Поэтому я не уверен, должен ли я вкладывать коллекцию клиентов в каждый документ ресторана или мне нужно, чтобы все клиенты были в корневой коллекции, а затем фильтровать их.

Не могли бы вы помочь мне с этим и дать некоторые идеи о том, как вы думаете, это лучший способ управлять этим с правилами Firestore?

1 ответ

Решение

Это предложение, основанное на том, что вы сказали:

Restaurants
    [id] (document)
        owner: idUser(Owner)
        waiters (map)
            idUser1: timestamp
            idUser2: timestamp
            idUser3: timestamp
        customersIn (collection)
            [idCustomer1] 
                itens: (map)
                    french fries: 10
                    water: 3
            [idCustomer2]
                itens: (map)
                    hot dog: 6
                    soda: 4
Customers
    [id] (document)
        name
        restaurants (map)
            idRestaurant1: timestamp
            idRestaurant2: timestamp
Users
    [id] (document)
        waiterIn (map)
            idRestaurant1: timestamp
            idRestaurant2: timestamp

Этот подход комментируется в https://firebase.google.com/docs/firestore/solutions/arrays, когда вы пытаетесь фильтровать и сортировать вместе...

В этом случае вы можете задать любые вопросы, например, клиенты в ресторане, официанты одного ресторана или рестораны официанта. Как это:

customersRef.where("restaurants." + idRestaurant, '>', 0).orderBy("restaurants." + idRestaurant);

Надеюсь это поможет!

Другие вопросы по тегам