質問

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

mysqlとasp.netを使用しています。

役に立ちましたか?

解決

使用 START TRANSACTION 指図。これははるかに高速です。

他のヒント

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


他の人に適用できる場合に備えて上記を離れますが、以下に説明する特定のケースについては、PrefsをTextFileに保存することを検討すると思います。とにかく注文がユーザーに表示されていることを考えると、Prefsがプレーンテキストファイルにあることにセキュリティリスクはなく、すべてを非常に迅速に書き換えることができます。以下で説明する方法を考えると、2列のCSVファイルを使用しますが、明らかにセットアップすることができますが、最も理にかなっています。

ファイルの読み取り速度で簡単に検索すると、 このコメントfile_get_contents() 機能。ファイル内のデータにアクセスするために使用する方法を検討するときに、ファイルの大きさに注意を払うことをお勧めします。書くことについては知りません。

あなたの質問は、少なくとも私にとってはある程度の明確さを欠いています。 id〜lankで参照するいくつかのエントリを表示すると思います。例えば:

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;

乾杯!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top