Модель данных для вложенного массива объектов в Firestore - PullRequest
0 голосов
/ 28 января 2020

Мне нужен совет опытных инженеров No SQL, как мне структурировать свои данные.

  • Я хочу смоделировать свою структуру данных SQL на No SQL для Google Cloud Firestore.
  • У меня нет опыта работы с базами данных No SQL, но я хорошо владею традиционными SQL.
  • . Я использую Node.js для написания запросов.

Пока что я преобразовал три таблицы в JSON документы с примерами данных:

{
  "session": {
      "userId": 99992222,
      "token": "jwttoken1191891j1kj1khjjk1hjk1kj1",
      "created": "timestamp"
  }
}
{
  "user": {
    "id": 99992222,
    "username": "userName",
    "avatarUrl": "https://url-xxxx.com",
    "lastLogin": "2019-11-23 13:59:48.884549",
    "created": "2019-11-23 13:59:48.884549",
    "modified": "2019-11-23 13:59:48.884549",
    "visits": 1,
    "profile": true,
    "basketDetail": { // I get this data from a third party API
      "response": { 
        "product_count": 2,
        "products": [
          {
            "product_id": 111,
            "usageInMinutes_recent": 0,
            "usageInMinutes": 0,
            "usageInMinutes_windows": 0,
            "usageInMinutes_mac": 0,
            "usageInMinutes_linux": 0
          },
          {
            "product_id": 222,  // no recent usage here
            "usageInMinutes": 0,
            "usageInMinutes_windows": 0,
            "usageInMinutes_mac": 0,
            "usageInMinutes_linux": 0
          }
        ]
      }
    }
  }
}
{
  "visitor": {
    "id": 999922221,
    "created": "2019-11-23 13:59:48.884549"
  }
}

Мои вопросы:

  1. session.userId, пользователь. id, visitor.id могут все обозначать одного и того же пользователя. Что такое Firestore эквивалентно внешним ключам в SQL? Как мне соединить / объединить эти три коллекции в запросе?
  2. Что мне делать с вложенным объектом basketDetail? Это хорошо, где это или я должен определить свою собственную коллекцию? Я ожидаю, что запросы

    • иногда добавляют все недавнее использование.
    • часто проверяют, есть ли у пользователя определенный c product_id
    • , часто заменяют целое baskedDetail объект с новыми данными.
    • иногда обновляет один спецификатор c product_id.
  3. Как бы я связал коллекции user с basketDetail в запросе, если бы я их отделил?

Спасибо за совет!

1 Ответ

2 голосов
/ 28 января 2020
  1. session.userId, user.id, visitor.id могут означать одного и того же пользователя. Что такое Firestore эквивалентно внешним ключам в SQL? Как мне соединить / объединить эти три коллекции в запросе?

К сожалению, в Firestore нет предложения JOIN. Запросы в Firestore мелкие, они могут получить только элементы из коллекции, с которой выполняется запрос. Невозможно получить документы из двух коллекций в одном запросе, если вы не используете запрос группы коллекций , но это не так, поскольку коллекции в вашем проекте имеют разные имена.

Если у вас есть три коллекции, то требуется три отдельных запроса. Невозможно достичь этого за один go.

Что мне делать с вложенным объектом basketDetail? Хорошо ли это там, где я нахожусь, или я должен определить свою собственную коллекцию?

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

Максимальный размер документа: 1 МБ (1 048 576 байт)

Как вы можете видеть , вы ограничены 1 МБ данных в одном документе. Поэтому, если вы считаете, что вложенный объект basketDetail может оставаться в рамках этого ограничения, вы можете использовать эту схему, в противном случае добавьте ее во вложенную коллекцию. Кроме того, все эти операции разрешены в Firestore. Если вам будет трудно их реализовать, опубликуйте еще один вопрос, чтобы мы могли на него взглянуть.

Как бы я связал пользователя коллекций с basketDetail в запросе, если бы я его отделил?

Вы не можете соединить / объединить две коллекции. Если вы разделяете basketDetail в подколлекции, тогда требуется два запроса.

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