Задать вопрос
@dmitriu256

Как правильно реализовать структуру таблиц продукт и цены продуктов?

Задача реализовать Бд в которой Продукт - пицца имеет одно название, но разную цену в зависимости от размера.
ВАРИАНТ РЕШЕНИЯ 1
Реализовал хранение основных данных, не изменяемые (название, image, описание) Таблица Goods.
Таблица goods_price хранит goods_id и три варианта (price, weight, size).
Структура таблицы Goods
691f6b4cbfc9e480471017.png
Таблица Goods
691f6b8bb1fad450817248.png
Таблица с ценами Goods_price
691f6bb017324833299380.png
Данные Goods_price
691f6bcc0be7b504003522.png
Связи в таблице Goods_price
691f6c32d032b265024423.png

При выборке получаю предупреждение из таблицы Goods
691f6c53dcba9643171055.png

В запросе хочу выбрать все товары из категория "Пицца" и имеют наименьший размер в 25 см (size_id = 1)
Запрос
`SELECT goods.id,
                                   goods.name,
                                   goods.url,
                                   goods.image,
                                   goods.description,
                                   category.category,
                                   promo.promo,
                                   size.size,
                                   goods_price.weight,
                                   goods_price.price
                            FROM goods
                                     JOIN
                                 category
                                 ON
                                     goods.category_id = category.id
                                     JOIN
                                 promo
                                 ON
                                     goods.promo_id = promo.id
                                     JOIN
                                 goods_price
                                 ON
                                     goods.id = goods_price.goods_id
                                     JOIN
                                 size
                                 ON
                                     goods_price.size_id = size.id
                            WHERE goods.category_id = ?
                              AND size.category_id = ? AND  goods_price.size_id = 1
                            ORDER BY goods.id ASC`;


Проект реализован на ExpressJs + mysql2
в ExpressJs выводится результат
691f6d20eb5cb138476922.png
Но получаю предупреждение в консоли
691f6d413c4dc158367804.png

1) Насколько правильна реализована логика работы в Бд?
2) Как исправить
Данное выделение не содержит уникального столбца
?
В таблице Goods поле Id - PrimaryKey
В таблице Goods_price поле Id - PrimaryKey, goods_id - вторичный ключ, связанный с таблицей Goods и полем id.

ВАРИАНТ РЕШЕНИЯ 2
Ранее что то подобное реализовал следующим образом
Пример на основе таблицы Orders и Orders_goods
Разбить запрос на два
1) Достать данные из таблицы Goods
2) Сформировать массив цен из таблицы Goods_products
//Показать товары пользователя
    async getOrders(req, res){
        const userId = req.userId;

        try{
           const [rows] = await connection.execute(`
               SELECT orders.id,
                      orders.user_id,
                      orders.status_id,
                      orders.created_at,
                      orders.total_price,
                      orders_status.status
               FROM orders
                        JOIN
                    orders_status
                    ON
                        orders.status_id = orders_status.id

               WHERE orders.user_id = ?`
               , [userId]);

           //Формируем сборный объект даных о заказе
           let obj = [];

           for(let item of rows){

               for(let key in item){
                   obj[key] = item[key];
               }

               const [goods] = await connection.execute(`
               SELECT orders_goods.id, orders_goods.goods_id, goods.name, goods.image, orders_goods.count, orders_goods.price
               FROM orders_goods
                        JOIN
                    goods
                    ON
                        orders_goods.goods_id = goods.id
               WHERE orders_goods.orders_id = ?
           `, [item.id]);

               //Полный путь к изображению в категориях
               for(let item of goods){
                   item.image = `${req.protocol}://${req.host}/${item.image}`;
               }

               item.goods = goods;
               obj.push(item);
           }


            return res.json({status: 'Success', orders: obj});

        }catch(error){
            res.status(400).json({status: false, message: error.message || error.sqlMessage});
        }
    }

Результат
691f78a8aaa05872452063.png
Ошибок при таком подходе не возникало не в БД, не со стороны NodeJs - ExpressJs.
  • Вопрос задан
  • 35 просмотров
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Skillbox
    Java-разработчик
    8 месяцев
    Далее
  • Shultais Education
    Основы SQL
    3 месяца
    Далее
  • OTUS
    PHP Developer. Professional
    5 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
Правильно — чтобы работало согласно ТЗ. Работает — значит сделали правильно, не работает — значит неправильно. Тут как бы других вариантов-то особо и нет.
Ответ написан
Комментировать
если нет других товаров, кроме пиццы, то решение вполне годное.

На будущее: вместо скриншотов, которые бесполезны чуть менее, чем полностью, пишите в вопросе DDL - в том же PHPMyAdmin его элементарно получить через кнопочку Export (она даже на скриншоты попала). Будет и компактнее, и информативнее.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы