Эффективное обновление нескольких записей - PullRequest
0 голосов
/ 06 декабря 2010

У меня на сайте есть таблица, где у пользователя есть возможность изменить порядок строк.Эту часть легко выполнить с помощью пользовательского интерфейса jQuery, а вернуть новый заказ просто, используя метод $('#sortable').sortable("serialize").Теперь у меня вопрос, какой самый эффективный способ сохранить все эти записи в базе данных, так как изменение порядка одного элемента изменяет все записи в таблице?Я знаю, что могу создать новый оператор UPDATE для каждой строки на основе их идентификатора, но мне кажется, что должен быть лучший способЕсть ли?

Я использую MySQL и ASP.NET.

Ответы [ 3 ]

3 голосов
/ 06 декабря 2010

Используйте команду START TRANSACTION. Это намного быстрее.

1 голос
/ 06 декабря 2010

Учитывая, что потенциально может быть произвольно большое количество строк, я бы сохранил порядок в виде записи текстовой строки в таблице пользовательских настроек (при условии, что у вас есть такая таблица).По сути, по умолчанию будет нулевая запись (для экономии места на диске), что будет означать, что порядок не изменяется по сравнению с порядком в базе данных, и, если пользователь изменяет его, вы можете просто сериализовать порядок строк (т.е.если бы у них была строка 15 сначала, затем 19, затем 3, вы могли бы иметь 15-19-3), а затем просто прочитать ее.Это одиночное обновление, и оно масштабируется до бесконечности (ну, до длины текстовой строки, но это довольно ужасно большой для типов mediumtext и longtext).


Я оставляю вышеупомянутое на всякий случай, если оно применимо к другим людям, но для конкретного случая, описанного ниже, я думаю, что я бы рассмотрел сохранение префов в текстовом файле.Учитывая, что порядок в любом случае показан пользователю, в префах, находящихся в незашифрованном файле, нет угрозы безопасности, и вы можете переписать все это очень быстро.Учитывая то, как вы это описали ниже, я бы использовал CSV-файл с двумя столбцами, но, очевидно, вы могли бы настроить его, однако имеет смысл.

Быстрый поиск по скоростям чтения файлов привел к этому комментарию в функции file_get_contents(), которая предполагает, что вы, возможно, захотите обратить внимание на размер файла при рассмотрении метода, который вы будете использовать для доступа к данным в файле.Я не знаю, как писать.

0 голосов
/ 06 декабря 2010

Вашему вопросу не хватает ясности, по крайней мере, для меня.Я полагаю, вы показываете несколько записей, на которые я буду ссылаться по ID ~ rank.Например:

5~1
6~2
7~3
1~4
24~5
2~6

Теперь вы говорите, изменяя, что «порядок одного элемента изменяет все записи в таблице».Это действительно необходимо в вашем дизайне?Если пользователь переключает элементы с идентификаторами 1 и 24, то у вас будет следующий сериализованный список:

[5~1],[6~2],[7~3],[24~5],[1~4],[2~6]

Теперь, повторяя этот список, вы можете легко определить, какие строки должны действительно обновляться (это несоответствиеестественный порядок ранга).

В моем примере вы должны сделать два запроса на обновление вместо шести:

update XYZ set rank=4 where id = 24;
update XYZ set rank=5 where id = 1;

Cheers!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...