Огневая база структура данных и URL-адрес
Я новичок в Firebase и nosql, поэтому несите меня, чтобы использовать ссылку на sql. Итак, мой вопрос заключается в том, как структурировать данные в firebase?
в firebase это означает, что каждая "новая firebase" = "новая база данных" или "таблица" в mysql?
Если в моем веб-приложение, у меня есть пользователи и комментарии. В mysql я создам таблицу пользователей и комментариев, а затем свяжу их вместе.
Как мне структурировать это в firebase?
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)
Это довольно прямое отображение того, как вы это моделируете реляционная база данных. Основная проблема с этой моделью-это количество запросов, которые вам нужно сделать, чтобы получить информацию, необходимую для одного экрана.
- прочитайте саму статью (из узла статьи)
- прочитайте информацию о комментариях (из узла ARTICLE_USER_COMMENT)
- прочитайте содержимое комментариев (из узла комментариев)
в зависимости от ваших потребностей, вам может даже понадобиться также прочитать пользователей узел.
и имейте в виду, что 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)
Я надеюсь, что это помогает в понимании иерархического моделирования данных и компромиссов, связанных.