Вопрос по структуре таблицы shop_product_features

Здравствуйте!

Подскажите пжлст по таблице. Вот ее структура:



как видим, она допускает дублирование строк в разрезе конкретного товара, артикула, свойства и значения.

Вопрос, какой в этом практический смысл что у товара может быть физически несколько комбинаций, которые по смыслу означают тот же самый набор связей?

Корректно ли, когда в базе есть такие дубли?

Будем благодарны получить пояснения, т.к. косвенно получили подтверждение через поддержку нашего клиента, что это вполне нормально.

2 ответа

  • 1
    Павел Трофимов 3 марта 2020 17:04 #

    Характеристика может касаться как товара в целом, так и отдельных артикулов. Соответственно, если характеристика (ее значение) относится непосредственно к товару - в sku_id стоит null.  Если к артикулу - id артикула. Соответственно, у разных артикулов могут быть разные значения характеристики.

    • +1
      cms1s.com cms1s.com 3 марта 2020 17:07 #

      Да, но если все 4 поля одинаковые, кроме ключа комбинации?

      например:

      id 1; product_id: 160; sku_id: ;feature_id: 1; feature_value_id: 24

      id 2; product_id: 160; sku_id: ;feature_id: 1; feature_value_id: 24

      id 3; product_id: 160; sku_id: ;feature_id: 1; feature_value_id: 24

      id 4; product_id: 160; sku_id: ;feature_id: 1; feature_value_id: 24

      Это ж не может означать разные артикулы?

      Т.е. в данном примере мы видим, что у продукта 160 есть свойство 1 со значением 24 и это свойство товара, т.к. ID артикула не указан.... и так 4 раза... информация именно дублируется. нельзя ведь к тому же самому товару 4 раза привязать тоже самое значение того же самого свойства.

      • +1
        Eugen Nichikov Eugen Nichikov 3 марта 2020 17:40 #

        Это особенность MySQL. В таблице уникальный составной ключ по product_id, sku_id, feature_id и feature_value_id, но NULL ломает уникальность.

        • +1
          cms1s.com cms1s.com 3 марта 2020 17:57 #

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

          • +1
            Eugen Nichikov Eugen Nichikov 3 марта 2020 18:03 #

            Shop-Script сам по себе не создаёт, а вот сторонние PHP-скрипты в корне сайта, которые делают запросы прямо к БД, вполне могут и создать ;)

            • +1
              cms1s.com cms1s.com 3 марта 2020 18:13 #

              Понимаю ваш сарказм, но в данном случае как раз модуль видит эту проблему, ДО того как что либо выгружать или загружать по этому товару :)


              В 1с у нас регистр выглядит так 



              т.е. для каждой настройки сайта комбинация из 4х значений является уникальной (т.к. это измерения регистра) и с незаполненным ключем в 1С нет проблемы. отбор по настройке сайта обязателен, да и у данного клиента используется 1н сайт, так что выгрузка дублей тут практически невозможна.
              • +1
                Eugen Nichikov Eugen Nichikov 3 марта 2020 19:03 #

                Даже если в 1С всё ок, целостность данных зависит от того как именно передаются значения в базу магазина.

                Например, из-за данной особенности MySQL нельзя использовать запросы вида INSERT IGNORE и INSERT ... ON DUPLICATE KEY UPDATE.

                Вполне возможно, что кто-то ДО вас наступил на эти грабли (сам ходил, знаю :)). Увы, тут только сначала проверять, существует ли такое значение при помощи SELECT, а потом добавлять, если его нет.

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

                • +1
                  cms1s.com cms1s.com 3 марта 2020 19:08 #

                  Да, мы бы не задавали лишних вопросов, тут просто база клиента в облаке Webasyst и почистить ее напрямую нет возможности.

                  • +1
                    cms1s.com cms1s.com 3 марта 2020 19:08 #

                    Спасибо в любом случае за ответы.

                  • +1
                    Eugen Nichikov Eugen Nichikov 3 марта 2020 19:17 #

                    хм... это интересно. А как тогда обнаружилось, что есть дубли?

                    • +1
                      cms1s.com cms1s.com 3 марта 2020 19:19 #

                      Как я писал выше - наш модуль перед обменом выбирает данные и проверяет (как вы выше и предложили), находит дубли и ругается. Обмен идет дальше, но свойства данного конкретного товара обновлены не будут.

                      • +2
                        Eugen Nichikov Eugen Nichikov 3 марта 2020 19:32 #

                        Вряд ли, но может поможет? Под админом открыть такую ссылку

                        /webasyst/shop/?module=repair&action=cleanupFeatures

  • 1
    Евгений Леман 5 марта 2020 23:59 #

    А вы, я смотрю, всё еще напрямую базу насилуете под видом "Плагин для SS"...

    • 0
      cms1s.com cms1s.com 6 марта 2020 00:52 #

      Здравствуйте, Евгений, насилует в данном случае базу ключ, который не является ключем по смыслу. Остальные офф-топ выводы прошу оставить при себе, ваши плагины связанные с изменением остатков, а так же другие связанные с изменением товара , заказа вызываются корректно.

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите