5

私はasp.net-mvc Webサイトを持っており、データのhtmlテーブルがあり、列の1つはその行の優先度を表すランキングです(各行はリクエストを表します)。ユーザーが新しい番号を使用して行のデータを編集できるようにしますが、実際には他の行には影響しません (たとえば、別の行に既に存在する値を入力することを妨げるものは何もありません)。

より効果的なフロントエンドと高速なバックエンドを持つソリューションを探しています。私はそれぞれを分解します:

  1. フロントエンド:

行を上下にドラッグ アンド ドロップするか、上下矢印をクリックするか、行にランキング値を入力すると、他のすべての行のランキングが更新される機能が必要です。1 位にランク付けされた新しいエントリがある場合、基本的にユーザーがすべての行を更新する必要はありません (基本的に、前の 1 => 2、前の 2 => 3、前の 3 => 4 などを更新する必要があります)。 . .

この機能をサポートするのに役立つjqueryライブラリまたは便利なパターンはありますか(すべてを最初から配線する必要がないようにするため)、これは他の多くの人が使用していると想像できる一般的な機能のようです。

参考までに、JIRA Greenhopper プランニング ボードに詳しい人がいる場合、これは模倣する例として理想的です。

  1. バックエンド

私の関連する質問は、バックエンドを更新するときに、これが非常に遅い操作になるのを回避する方法を見つけようとしているということです。私のデータベーステーブルにランクフィールドがあり、誰かがアイテムを更新してナンバーワンになる場合、基本的に他のすべての行で更新クエリを実行して、値を既存の値 + 1 に変更する必要があります。これを行うパターンはありますか?より効果的に?

4

8 に答える 8

1

アイテムを上下に移動するには、jQuery UI sortableを使用できます。最も簡単な解決策は、score と呼ばれる浮動小数点数 (場合によっては double) をすべての項目に追加することです。これは、順序が変更される可能性がある場合に、一連の要素の順序を維持するためのより効率的な手法であることが知られています。このスコアは、DB からプレゼンテーション レイヤーまでのすべてのレイヤーで保持する必要があります。他の 2 つの要素の間に要素を配置する必要がある場合は、フロートを 2 つの要素の平均値に設定するだけで、要素がそれらの間にあることを確認できます。

スコアでソートされた DB からすべてのアイテムを取得します。

アルゴリズムは、スコアが 0 と 1 の 2 つの偽のアイテム (レンダリングされず、DB に挿入されず、純粋に仮想) で開始します。すべての「本物の」アイテムはそれらの間に挿入されます。したがって、最初の要素のスコアは 0.5 などになります。

到達した 2 つのスコア間の最小距離を DB に保存する必要があります。この数値が小さくなりすぎて、double で得られる最小精度に近づいている場合は、2 つの連続する要素間のすべてのスコア距離が同じで 1/(アイテム数)。

ユーザーに「クラシック ランク」の 1、2、3 を表示する必要がある場合は、ページをレンダリングする直前、および各ユーザーが変更した直後に Web ページで作成できます。すべてのランクを更新するには、画面に表示されているアイテムと同じコストがかかります。これは大きな問題ではありません。画面上のすべての要素をブラウザで再レンダリングする必要があるため、画面上のすべてのランクを再書き込みするコストよりも高いコストがかかるため、パフォーマンスが低下することはありません。...重要...仮想スクロールまたはページングがある場合...ランクの再書き込みには、画面上のアクティブな要素のみが含まれます。これは、すべての計算がスコア。

于 2013-08-23T19:59:03.457 に答える
0

バックエンドのアイデアをいくつか紹介します。

バックエンドの値を次のようにします: 1 – ランク #1 100 – ランク #2 200 – ランク #3 など…

これにより、他の 2 つの値の間に値を追加するときに、最小数の行を更新できます。

たとえば、ランク #3 に値を挿入する場合は、値 150 を入力するだけです。

ユーザーにデータを表示するときは、データベース内の実際の値を表示するのではなく、ROW_NUMBER関数を使用してユーザー フレンドリーな方法で表示します。

1 位に何かを追加したい場合は、既存の 1 位よりも小さい値を入力するだけです。順序が正しい限り、実際の値が -250 のように見えても問題ありません。ROW_NUMBER 関数が表示を処理します。

たまに行う必要があるのは、値を並べ替えて、2 つの間に十分なスペースを確保することだけです。

于 2013-07-19T10:17:35.680 に答える
0

@Dwoolkの答えを拡張すると、順序付けにフロートを使用できます。そうすれば、常に (少なくとも長い間) 2 つの既存の値の間で新しい値を見つけることができるはずです。

于 2013-08-21T16:47:36.960 に答える