Добрый.
Для прокачки скила в NOSQL пишу приложение под андройд для отслеживания покупок продуктов.
В качестве бэкенда используется Firebase.
Примерная структура такая:
user_id
category_list //список категорий продуктов, испоьзуется для разделения и визуальной раскраски
category_name
category_color
product_list //список продуктов в этой категории
product_name_1
product_name_2
product_list //общий список продуктов в базе, используется для автодополнения
product_name_1
product_description
measure_unit
category_name //категория, к которой принадлежит этот продукт
product_name_2
product_description
measure_unit
category_name
cart_info_list //список созданных "корзин" с суммой покупок в ней
cart_id
cart_description
cart_total
cart_data_list //сами созданные "корзины" с непосредственно продуктами внутри
cart_id
product_seq_id
product_name
product_price
Суть в следующем:
1. юзер открывает приложение, мы читаем содержимое ветки "cart_info_list" и отображаем список "корзин"
2. юзер выбирает "корзину", по ее id мы читаем напрямую ветку "cart_data_list/cart_id" и отображаем список продуктов этой "корзины"
2.1. при этом считываем целиком ветки "category_list" (для распределения продуктов по категориям) и "product_list" (для автодополнения имен при добавлении нового продукта)
Такова минимальная последовательность действий при работе с этой БД.
Теперь касательно вопроса.
Юзер может свободно переносить продукты из одной категории в другую, менять параметры категории (имя, цвет и т.п.), создавать новые продукты в справочнике или менять текущие.
При изменении данных категории надо изменить связи в продуктах. Вот здесь и кроется вопрос: как лучше это организовать?
В доках по Firebase говорят про постоянную денормализацию данных (я из мира SQL, поэтому мне это не очень привычно). В качестве примеров советуют дублировать данные по разным веткам и обновлять их одновременно (транзакциями, например). Аргументируют тем, что денормализировав данные мы сокращаем количество обращений к БД. По этой же причине я вынес "cart_info_list" в отдельную ветку.
В данной ситуации дублирование заключается в связи категорий с продуктами. Какой способ правильный?
Например сейчас, при изменении инфы в категориях или продуктах необходимо изменить данные в двух ветках.
Один из вариантов, которые я рассматривал, заключался в том, что бы хранить связь лишь в одном месте из двух (или в категориях или в продуктах).
Другой вариант заключался в том, что бы убрать эти связи из "category_list" и "product_list" и вынести их вообще в отдельный список примерно такого вида:
product_category_map
product_name : category_name
Но вот за неимением достаточного опыта в NOSQL не знаю какой из вариантов лучше выбрать.
Понятно, что в данном проекте это большого значения не имеет, но учитывая, что приложение служит для получения опыта, лучше бы этот момент обработать с разных сторон, поняв общие принципы построения подобных БД.