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

Новичок в Firebase/FireStore и не имеет никакого опыта в NoSQL,

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

Это формат JSON:

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

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

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:

Каждый документ содержит набор пар ключ-значение. Cloud Firestore оптимизирован для хранения больших коллекций небольших документов.

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

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

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

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

Этот запрос возвращает каждый городской документ, где поле регионов представляет собой массив, содержащий west_coast. Если в массиве есть несколько экземпляров значения, по которому вы запрашиваете, документ включается в результаты только один раз.

Я думаю, вы должны использовать это

Сообщение:

{
 "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"
}
]
Другие вопросы по тегам