Как установить внешние ключи в Firestore? - PullRequest
0 голосов
/ 02 июня 2018

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

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

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

Существуют ли другие способы установки внешних ключей?

Структура базы данных:

Users/doc_id/name..

Categories/fashion/clothing/auto_doc_id/type:denims

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

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

enter image description here

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

Теперь у меня есть другой узел, который называется users, и внутри вы можете видеть мой userID

enter image description here

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

Итак, что бы я сделал, это

  • Iсохранить все данные в пользователях (с идентификатором пользователя в качестве основного узла pk)
  • Когда мне нравится сообщение, я запрашиваю идентификатор пользователя этого понравившегося пользователя, вытащить его и сохранить в моем узле Likes.

Вот так я использую внешний ключ, такой как userID, для работы с 2 разными узлами

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

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

0 голосов
/ 04 июня 2018

для запроса всех элементов, опубликованных конкретным пользователем.

Для этого нет необходимости устанавливать user_id в качестве внешнего ключа для каждого публикуемого элемента, а такжеitem_id в коллекции пользователей.Вы можете добавить только новое свойство к объекту предмета с именем postedBy, которое будет содержать в качестве значения идентификатор пользователя.Чтобы отобразить только элементы определенного пользователя, вам нужно запросить базу данных, используя следующий код:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference itemsRef = rootRef.collection("items");
Query query = itemsRef.whereEqualTo("postedBy", user_id);

Существует также другой подход, который предусматривает дублирование данных.Там нет проблем с этой техникой, когда речь заходит о Firebase.Это довольно распространенная практика, которая называется denormalization, и для этого я рекомендую вам посмотреть это видео, Денормализация нормальна для базы данных Firebase .Это для базы данных Firebase Realtime, но эта концепция применима также и к Cloud Firestore.

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

Firestore-root
     |
     --- users (collecton)
          |
          --- userId (document)
                 |
                 --- userItems (collecton)
                        |
                        --- itemId (document)

Когда вы дублируете данные, необходимо помнить об одной вещи.Точно так же, как вы добавляете данные, вы должны поддерживать их.Другими словами, если вы хотите обновить / обнаружить элемент, вы должны делать это в каждом месте, где он существует.

0 голосов
/ 02 июня 2018

Допустим, у вас есть элемент магазина в shop / {shop_id} в качестве документа, в котором есть поле ссылки, указывающее на user / {user_id}.Чтобы установить эту ссылку программно:

FirebaseFirestore firestore = FirebaseFirestore.getInstance();
DocumentReference userRef = firestore.collection("user").document({user_id});
Map<String, Object> map = new HashMap<>();
map.put("user", userRef);
firestore.collection("shop").document({shop_id}).update(map);

Чтобы получить этого пользователя, вы можете сделать:

firestore.collection("shop").document({shop_id}).addSnapshotListener(this, (shopItemSnapshot, e) -> {
    // Get the shopItem here
    // ShopItem shopItem = shopItemSnapshot.toObject(ShopItem.class);
    ((DocumentReference) shopItemSnapshot.get("user")).addSnapshotListener((userSnapshot, e1) -> 
        // Get the user from the shopItem document
        User user = userSnapshot.toObject(User.class);
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...