Структурирование данных в Firestore в отношениях «принадлежит и имеет много» - PullRequest
1 голос
/ 11 апреля 2020

Исходя из фона SQL / Rails У меня есть проект, для которого я хочу использовать Firebase / Firestore (с React) и прошу помощи в настройке структуры данных и сбора.

"Модели":

  • Пользователи
  • Элементы
  • Категории
  • Местоположение

У пользователя может быть много элементов, и элемент принадлежит Пользователь. В категории может быть много элементов, и элемент принадлежит категории.

Мне нужно, чтобы я мог отображать все категории, местоположения и элементы на главной странице. Сначала мне нужно перечислить все предметы, и они могут быть отфильтрованы по категориям и / или расположению.

Как лучше настроить эти данные в Firestore?

Извините за рельсы в стиле объяснения, но SQL все вокруг моей головы.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

I предположим, вы думаете с точки зрения внешних ключей, как в sql DB. Что обычно происходит в сценарии без sql, так это то, что вы должны избегать отношений и - вставлять отношения в "большой" документ (document = json объект в не sql).

Там для этого нет указания c rece ie.

То, что Алекс пытался объяснить, это то, что вы должны подумать, что является центральным элементом вашего дизайна. Похоже, что это элемент 'item'.

Возможный дизайн может быть:

  • Сохранить категорию и местоположение в виде простого текста в объекте json, представляющем ваш элемент. .

  • Затем используйте массив для перечисления элементов в интерфейсе

  • Наконец, используйте функцию JS array.filter () для интерфейс для фильтрации того, что отображается в ответ на действия пользователя.

Если вам нужно показать только элементы, принадлежащие пользователю, добавьте поле «пользователь» в документ «элемент» и попросите firestore вернуть только те документы, чье поле 'user' соответствует вашему зарегистрированному пользователю.

Это немного устарело, но должно помочь вам понять денормализацию данных в no sql: https://firebase.googleblog.com/2013/04/denormalizing-your-data-is-normal.html?m=1

Редактировать

В отношении ответа Джея и статьи MongoDB, указанной в комментариях, я всегда изо всех сил старался принять решение: если встраивать данные или ссылаться на них, но я ' Мы всегда заканчивали тем, что встраивали маленькие документы.

Можете ли вы, Джей, поделиться своим опытом?

Мне всегда было довольно скучно создавать дополнительные запросы в интерфейсе, чтобы присоединиться к необходимой информации (а-ля sql), хотя редко у меня есть преимущества в указании других small документов. Я предполагаю, что это в основном зависит от дизайна приложения.

Короче говоря

Я предпочитаю что-то вроде

users_collection > user_uuid_0
{
    "name": "John"
    "items": [
        {/*...plain item1 object here...*/},
        {/*...plain item2 object here...*/},
        /*...*/
    ]
}

Вместо:

users_collection > user_uuid_0
{
    "name": "John"
    "items_ids":[
      "item_uuid_0",
      "item_uuid_1",
      /*...*/
    ]
}

---

items_collection > item_1
{
   /*all item fields*/
   "belong_to": "user_uuid_0"
}

items_collection > item_2
{
   /*all item fields*/
   "belong_to": "user_uuid_0"
}

Преимущества последнего решения заключаются в большей гибкости и развязке: вы можете изменять пользовательские данные без какого-либо влияния на элементы, и ваши полезные нагрузки будут меньше (если размер trafi c важнее, чем количество операций в вашем сервисе) .

минусы: требуется 2 запроса к БД (1, чтобы получить пользователя, сделать c, и один, чтобы получить элементы, отфильтрованные по id), против 1; требуется несколько операций над интерфейсом, чтобы вспомнить все, а не добавленных операций, так как предыдущая компоновка do c уже встраивает все.

Первая работает хорошо, если:

  • у вас отношения один к нескольким (один ко многим склоняется к ссылкам uuid, как предложено Джэем)
  • ваши документы маленькие (в противном случае решение Джея снова будет лучше)
  • если вы оплачиваете операцию, а не трафик c размер

Когда мы думаем об управляемой базе данных no sql, такой как firestore, где, как правило, ваш CRUD API в основном представляет собой REST API или что-то очень близкое к этому (без JPA, DTO-проекций и т. д.), по моему опыту, первый макет лучше подходит.

Но, опять же, это в основном связано с дизайном приложения и Стоимость услуг.

0 голосов
/ 13 апреля 2020

Это упрощенный c подход, но он соответствует требованиям, изложенным в вопросе.

Вам понадобятся четыре сборника, по одному для каждой из категорий, упомянутых в вопросе, а затем документы в каждый будет содержать информацию об этом элементе плюс ссылку на то, кто «владеет» этим документом

Users
   uid_0
      name: "Kirk"
   uid_1
      name: "McCoy"
   uid_2
      name: "Spock"

Items
   item_0
      name: "Communicator"
      belongs_to_user: uid_0
      category: "cat_0"
      location: "location_3"
   item_1
      name: "Tricorder"
      belongs_to_user: "uid_1"
      category: "cat_0"
      location: "location_2"
   item_2
      name: "Captains Chair"
      belongs_to_user: "uid_0"
      category: "cat_2"
      location: "location_0"
   item_3
      name: "Science station"
      belongs_to_user: "uid_2"
      category: "cat_1"
      location: "location_0"

Categories
   cat_0
      name: "Hand held devices"
   cat_1
      name: "Stations"
   cat_2
      name: "Furniture"

Locations
   location_0
      name: "Bridge"
   location_1
      name: "Engine Room"
   location_2
      name: "Sick Bay"
   location_3
      name: "Shore leave"

У пользователя может быть много элементов, и элемент принадлежит пользователю.

Данные пользователей хранятся в коллекции пользователей, а documentId - это идентификатор пользователя. В приведенном выше примере пользователь Кирк (uid_0) имеет два элемента: item_0 (коммуникатор) и item_2 (стул капитана). Аналогично, у пользователя McCoy есть трикодер и Спок в качестве научной станции.

В категории может быть много элементов, и элемент принадлежит категории.

В этом примере мы имеют три категории, и коммуникатор и трикодер принадлежат к портативным устройствам cat_0.

Сначала мне нужно перечислить все элементы, и они могут быть отфильтрованы по категориям и / или расположению.

Приведенная выше структура позволит вам получить список всех предметов. Затем их можно отфильтровать по пользователям, по какой категории они принадлежат и по местоположению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...