uhfath
@uhfath
Разработчик

Как лучше организовать структуру БД NOSQL для приложения покупок?

Добрый.

Для прокачки скила в 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 не знаю какой из вариантов лучше выбрать.
Понятно, что в данном проекте это большого значения не имеет, но учитывая, что приложение служит для получения опыта, лучше бы этот момент обработать с разных сторон, поняв общие принципы построения подобных БД.
  • Вопрос задан
  • 472 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы