Как структурировать Firestore JSON отношения "многие ко многим" в API блога

Новичок в Firebase / FireStore и не имеет опыта работы с NoSQL.

Изучая Android и создавая приложение для себя, я понял, что мне нужно решение для работы с базами данных в реальном времени. Но я застрял в построении модельной структуры.

Это формат JSON:

{
 "published": "date",
 "title": "This is the title",
 "content": "This is the body",
 "tags": [
  "tag1", "tag2"
 ]
}

Проблема заключается в отношении tags "многие ко многим". Понятно, что FireStore может решить эту проблему с помощью индексации, но как мне структурировать данные с помощью коллекций и документов? Кто-нибудь может подробно объяснить?

теги - строки или документы?

Tim 03.08.2018 14:25

Я сейчас запутался, но я думаю, что это строки, поправьте меня, если я ошибаюсь.

Rajarshi 03.08.2018 14:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
687
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Предполагая, что фрагмент вашего вопроса является объектом post, я рекомендую вам схему базы данных, которая выглядит следующим образом:

Firestore-root
    |
    --- posts (collection)
          |
          --- postId (document)
                |
                --- published: "date"
                |
                --- title: "This is the title"
                |
                --- content: "This is the body"
                |
                --- tags
                     |
                     --- tag1: true
                     |
                     --- tag2: true

Согласно официальной документации относительно данные моделирования в базе данных Cloud Firestore:

Each document contains a set of key-value pairs. Cloud Firestore is optimized for storing large collections of small documents.

Так что это лучшая структура базы данных, которую я могу придумать для вашего приложения, и, как вы можете видеть, свойство tags - это не array, а map. Это лучшая практика, когда дело доходит до такого рода объектов. См. Также официальную документацию по работа с массивами, списками и наборами.

Изменить 13 августа 2018:

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

CollectionReference citiesRef = db.collection("cities");
citiesRef.whereArrayContains("regions", "west_coast");

This query returns every city document where the regions field is an array that contains west_coast. If the array has multiple instances of the value you query on, the document is included in the results only once.

Для этого конкретного варианта использования есть еще лучшая страница документации: firebase.google.com/docs/firestore/solutions/arrays. Обратите внимание, что это скоро изменится, так как в настоящее время ведется работа над набором операций с массивом.

Frank van Puffelen 03.08.2018 15:24

@FrankvanPuffelen Привет, Пуф! Разве ваша ссылка не совпадает с той, которую я добавил в конце своего ответа? Кстати, не могу дождаться новых изменений :)

Alex Mamo 03.08.2018 15:30

Вупс. Да, пропустил: заметил только первую ссылку. :-) Извини за это.

Frank van Puffelen 03.08.2018 15:39

@AlexMamo Спасибо за быстрый ответ. Немного скептически отношусь к тому, как это работает, возможно, успешная транзакция поможет мне понять. А пока, пожалуйста, останься со мной.

Rajarshi 03.08.2018 16:40

Хорошо, держи меня в курсе.

Alex Mamo 03.08.2018 17:54

Я думаю, тебе стоит использовать это

Почта:

{
 "published": "date",
 "title": "This is the title",
 "content": "This is the body",
 "tags": [
 "xxx", "yyy"
  ]
}

Теги

[
{
    "tag_id":"xxx",
        "tag_name":"abc"
},
{
    "tag_id":"yyy",
        "tag_name":"abc"
}
]

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