2010-12-06 14 views
0

私は自分のサイトに、ユーザーが行を並べ替えることができるテーブルを持っています。この部分は、jQuery UIで簡単に行うことができ、$('#sortable').sortable("serialize")メソッドを使用すると新しい注文を元に戻すことが簡単です。 1つのアイテムの順序を変更すると、テーブル内のすべてのレコードが変更されるため、データベースにこれらのレコードをすべて保存する最も効率的な方法は何ですか。 IDに基づいて各行に新しいUPDATEステートメントを作成できることは分かっていますが、より良い方法が必要だと感じています。ある?複数のレコードを効率的に更新する

私はMySQLとASP.NETを使用しています。

+0

明確にするために、特定の並べ替え順を保存しようとしていますが、正しいですか? – eykanal

+0

@eykanalそれは正しいです。私はレコードの順序を格納する "ランク"という名前の列を持っています。 – Jason

答えて

3

START TRANSACTIONコマンドを使用してください。これははるかに高速です。

+0

私はその記事を読んでいますが、本当にそれが何をしているのかを実際には説明していません。あなたは精緻化できますか?一度に1つのコマンドではなく、一度にすべての変更をコミットしますか? – Jason

+0

はい。一連の文がトランザクション内にある場合、それらはすべて一緒に実行されます。テーブルが非常に大きい場合を除き、トランザクション内で一連の更新を行うのは簡単で効果的です。 –

1

任意の数の行がある可能性があることを考えれば、私はそのようなテーブルを持っていると仮定して、ユーザー設定テーブルにテキスト文字列として注文を格納します。基本的には、デフォルトはヌルエントリ(ディスクスペースを節約するため)になります。これは、データベースの順序と順序が変わらないことを意味し、ユーザーが変更すると行の順序をシリアル化できます最初に15行、次に19行、3行あった場合は15-19-3になります)、それを読んでください。これは単一の更新であり、無制限に拡大されます(文字列の長さまでですが、およびlongtextタイプの場合は)。


私は念のために、それは他の人に適用されるのですが、以下に記載される特定の場合のために、私はテキストファイルに環境設定を格納考えると思う以上を残しています。とにかくユーザーに注文が表示されていると仮定すると、プレインテキストファイルにセキュリティ上のリスクはなく、すべてをすばやく書き換えることができます。以下にその記述方法を説明すると、2列のCSVファイルを使用しますが、明らかにそれを設定することができますが、最も理にかなっています。

file_get_contents()機能では、ファイルの読み取り速度をすばやく検索するとthis commentになりました。これは、ファイル内のデータにアクセスする方法を検討する際に、ファイルのサイズに注意する必要があることを示しています。私は書くことを知らない。

+0

答えに感謝します。私はこれが単なるユーザーの好みではないので、私のケースではこれが当てはまるとは思わない。これらは永続的な発注変更で、サイト全体に反映されます。そのようなものを実装するためには、「1-10; 2-8; 3-4」のようにもっとトリッキーなことをしなければならないでしょう。一つはレコードのID、もう一つはランクです。これは間違いなく実行可能ですが、私はメンテナンスの面で理想的な解決策ではないと感じています。 – Jason

+0

@ Jason - ああ、他の人のサイト要件を前提にしたときの状況を示しています。私は別の可能な提案で私の答えを更新しました。 – eykanal

+0

このソリューションはかなり興味深いようです。私が見ている問題は、SQLクエリでランク付けが必要な場合には問題が生じることです。しかし、これは他の人の要求に関する仮定です) –

0

あなたの質問には少なくとも私のためにいくらか明確さが欠けています。私はあなたがID〜ランクで参照するいくつかのエントリを表示すると想像します。たとえば、

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

これで、「1つの項目の順序が表のすべてのレコードを変更する」と変更したとします。これは本当にあなたのデザインに必要ですか?ユーザーがID-s 1と24と要素を切り替えた場合、あなたは以下のシリアル化されたリストがあります:あなたは簡単に行が実際に更新されるべきかを決定することができ、このリストを反復することにより、今

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

を(これは自然のミスマッチランク順)。私の例では

あなたの代わりに6の2つの更新クエリを作成する必要があります

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

乾杯を!

+0

答えに感謝します。誰かが何かをランク1からランク4に動かすとどうなりますか?ランク2をランク1に、ランク3を2に変更しませんか? \ – Jason

+0

もちろん、最初の行を一番下に移動するのは最悪のシナリオですが、スイッチは一番速いです。この単純な方法は、おそらくあなたがランクに穴を残しても改善することができますが、それはもうシンプルで保守的ではないようです... –

関連する問題