SWSnake
@SWSnake
Web-разработчик

Какую сделать структуру таблицы в MySQL, чтоб менять позицию записи с минимальным усилием сервера?

Пример ситуации:
Есть сайт. На нём есть список товаров. Сортировка товаров задаётся вручную администратором.
Администратор захотел перенести товар с 48 позиции на позицию между 2 и 3 товаром.

Вопрос:
Как организовать структуру базы данных, чтоб такая операция выполнялась с минимальным усилием сервера?

Предполагаемые варианты:
  • Сделать в таблице колонку "позиция". Товары будут получать позиции в виде: 1, 2, 3, 4, 5... При смене позиции 48 товара на 3, всем товарам между 2 и 48 необходимо будет увеличить позицию на один, а 48-му сменить позицию на 3.
  • Сделать в таблице колонку "значимость". Товары будут получать значимость в виде: 100, 200, 300, 400, 500... При смене позиции с 48 на 3, необходимо будет получить значение значимости 2 и 3 товара и 48-му сменить значимость на среднее значение от полученных. Но со временем можно будет дойти до того, что значения значимости будут идти по порядку и наступит первый предполагаемый вариант, либо надо будет пройтись по всем товарам и установить значимость снова в виде 100, 200, 300, 400, 500...
Подскажите, как лучше организовать структуру. Может есть хорошее решение для такой задачи?
  • Вопрос задан
  • 328 просмотров
Решения вопроса 1
SWSnake
@SWSnake Автор вопроса
Web-разработчик
Изучив все предложенные варианты, пришёл к выводу, что если нагрузка предполагается маленькая, то сделать по-простому: каждому товару давать номер позиции (первый предполагаемый вариант).

А если нагрузка увеличится, то можно переделать под вариант со значимостью с шагом, равным 1024 (позволяет 10 раз вставить другие товары после определённого товара). И во время смены позиции сделать проверку: если между вставляемыми товарами разница значимости равна единице, то всем товарам пересчитать данный показатель, снова установив шаг, равный 1024.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@Fortop
Tech/Team lead
Вопрос "минимальных усилий" для списка из 48 товаров (и даже 10000) не имеет значения.

Он у вас возникнет если эти изменения вы пожелаете делать десятки раз в секунду на базе под нагрузкой в десятки/сотни запросов в секунду.

До тех пор варианты 1 и 2 равнозначны.
Ответ написан
Комментировать
ProKiLL
@ProKiLL
Системный администратор
Я бы тебе посоветовал воспользоватся запросами в базу типа update
Обменял значения 3 и 48 товаров и смены значимости соответственно
Ответ написан
Я бы выбрал "значимость" в случае если вставка невозможна т.к. 2 и 3 следуют друг за другом не обязательно пересчитывать всю таблицу достаточно "сдвинуть" значимость 3 товара ближе к 4 и потом вставить перед ним 48.
Ответ написан
Ваш ответ на вопрос

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

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