Огневая база структура данных и URL-адрес


Я новичок в Firebase и nosql, поэтому несите меня, чтобы использовать ссылку на sql. Итак, мой вопрос заключается в том, как структурировать данные в firebase?

в firebase это означает, что каждая "новая firebase" = "новая база данных" или "таблица" в mysql?

Если в моем веб-приложение, у меня есть пользователи и комментарии. В mysql я создам таблицу пользователей и комментариев, а затем свяжу их вместе.

Как мне структурировать это в firebase?

1 53

1 ответ:

если у вас есть пользователи и комментарии, Вы можете легко смоделировать его следующим образом:

ROOT
 |
 +-- vzhen
 |     |
 |     +-- Vzhen's comment 1
 |     |
 |     +-- Vzhen's comment 2
 |
 +-- Frank van Puffelen
       |
       +-- Frank's comment 1
       |
       +-- Frank's comment 2

однако более вероятно, что существует третья сущность, такая как статья, и что пользователи комментируют (друг друга) статьи.

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

ROOT
 |
 +-- ARTICLES
 |     |
 |     +-- Text of article 1 (AID=1)
 |     |
 |     +-- Text of article 2 (AID=2)
 |
 +-- USERS
 |     |
 |     +-- vzhen (UID=1056201)
 |     |
 |     +-- Frank van Puffelen (UID=209103)
 |
 +-- COMMENTS
 |     |
 |     +-- Vzhen's comment on Article 1 (CID=1)
 |     |
 |     +-- Frank's response (CID=2)
 |     |
 |     +-- Frank's comment on article 2 (AID=2,UID=209103)
 |
 +-- ARTICLE_USER_COMMENT
       |
       +-- (AID=1,UID=1056201,CID=1)
       |
       +-- (AID=1,UID=209103,CID=2)
       |
       +-- (AID=2,UID=209103,CID=3)

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

  1. прочитайте саму статью (из узла статьи)
  2. прочитайте информацию о комментариях (из узла ARTICLE_USER_COMMENT)
  3. прочитайте содержимое комментариев (из узла комментариев)

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

и имейте в виду, что Firebase не имеет понятия предложения WHERE, которое позволяет вам выбирать только элементы из ARTICLE_USER_COMMENT, соответствующие конкретной статье или конкретному пользователю.

на практике этот способ отображения структуры не используется. Firebase-это иерархическая структура данных, поэтому мы должны использовать уникальные возможности, которые дает нам более традиционная реляционная модель. Например: нам не нужен узел ARTICLE_USER_COMMENT, мы можем просто держите эту информацию непосредственно под каждой статьей, пользователем и самим комментарием.

небольшой фрагмент этого:

ROOT
 |
 +-- ARTICLES
 |     |
 |     +-- Text of article 1 (AID=1)
 |     .    |
 |     .    +-- (CID=1,UID=1056201)
 |     .    |
 |          +-- (CID=2,UID=209103)
 |
 +-- USERS
 |     |
 |     +-- vzhen (UID=1056201)
 |     .    |
 |     .    +-- (AID=1,CID=1)
 |     .    
 |
 +-- COMMENTS
       |
       +-- Vzhen's comment on Article 1 (CID=1)
       |
       +-- Frank's response (CID=2)
       |
       +-- Frank's comment on article 2 (CID=3)

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

если вы доведете эту денормализацию до крайности, вы получите такую структуру данных:

ROOT
 |
 +-- ARTICLES
 |     |
 |     +-- Text of article 1 (AID=1)
 |     |    |
 |     |    +-- Vzhen's comment on Article 1 (UID=1056201)
 |     |    |
 |     |    +-- Frank's response (UID=209103)
 |     |
 |     +-- Text of article 2 (AID=2)
 |          |
 |          +-- Frank's comment on Article 2 (UID=209103)
 |
 +-- USERS
       |
       +-- vzhen (UID=1056201)
       |    |
       |    +-- Vzhen's comment on Article 1 (AID=1)
       |
       +-- Frank van Puffelen (UID=209103)
            |
            +-- Frank's response (AID=1)
            |
            +-- Frank's comment on Article 2 (AID=2)

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

единственное, что все еще сложно в этой модели, это то, что Firebase не имеет API для прохождения таких "ссылок", поэтому вам придется искать пользователя/статью самостоятельно. Это становится намного проще, если вы используете UID/AID (в этом примере) в качестве имени узла, который идентифицирует пользователя / статью.

Итак, это приводит к нашей окончательной модели:

ROOT
 |
 +-- ARTICLES
 |     |
 |     +-- AID_1
 |     |    |
 |     |    +-- Text of article 1
 |     |    |
 |     |    +-- COMMENTS
 |     |         |
 |     |         +-- Vzhen's comment on Article 1 (UID=1056201)
 |     |         |
 |     |         +-- Frank's response (UID=209103)
 |     |
 |     +-- AID_2
 |          |
 |          +-- Text of article 2
 |          |
 |          +-- COMMENTS
 |               |
 |               +-- Frank's comment on Article 2 (UID=209103)
 |
 +-- USERS
       |
       +-- UID_1056201
       |    |
       |    +-- vzhen
       |    |
       |    +-- COMMENTS
       |         |
       |         +-- Vzhen's comment on Article 1 (AID=1)
       |
       +-- UID_209103
            |
            +-- Frank van Puffelen
            |
            +-- COMMENTS
                 |
                 +-- Frank's response (AID=1)
                 |
                 +-- Frank's comment on Article 2 (AID=2)

Я надеюсь, что это помогает в понимании иерархического моделирования данных и компромиссов, связанных.