4

私のアプリケーションでは、ユーザーはお気に入りの本を好きな順序で並べ替えることができます。

データベースに「本」テーブルがあり、各本の行があります。現在、各本の位置を格納する「position」と呼ばれる整数列があります。1つは一番上の本、2つは次の本などです。

問題は、誰かが本をたとえば位置#11000から位置#1にドラッグした場合、データベースに11,000回の更新を行う必要があることです。これは非効率的なようです。これを行うためのより良い方法はありますか?

私が持っていたアイデアの1つは、「book_sort_orderings」などと呼ばれる別のテーブルを作成し、ユーザーごとに1つの行を作成することです。また、1つの列は、書籍IDの並べ替えられたリストを格納する巨大なテキスト列になります。次に、ユーザーが本を再配置するときに、この値をコードに引き出し、そこで再配置を実行して、データベースの行を更新できます。もちろん、本が追加または削除されるたびに、この配列も更新する必要があります。これは物事を進めるための「正しい」方法ですか?または、現在の設定を変更せずに処理を高速化するためにできる賢い方法はありますか?

4

3 に答える 3

8

(行ごとに個別のデータベースラウンドトリップを行うのではなく)「バルク」方式で更新すると仮定すると、適切なDBMSが11,000行を更新できる速度に驚かれることでしょう。

しかし、それを避けたい場合は、古いBASICトリックを使用してください(BASICがまだ行番号を持っていたときから):ギャップを残してください!

位置を使用する代わりに:1, 2, 3, 4, 5 etc...を使用します10, 20, 30, 40, 50 etc...

したがって、最初のアイテムを最後から2番目の場所に移動する必要がある場合は、10を41に変更するだけで、最終的に次のようになります20, 30, 40, 41, 50 etc...。明らかに、ギャップが完全に埋められた場合に備えて、いじくり回す必要がありますが、この戦略により、大規模なUPDATEをほぼ排除できるはずです。


もう1つの可能性は、二重リンクリストを実装することです。順序の代わりに、前のアイテムと次のアイテムのIDを保持します。並べ替えは、メモリ内のリストの場合と同じように、IDを「再リンク」するだけで実行できます。残念ながら、DBMSがアイテムを直接並べ替えることもできなくなります(少なくとも厄介で非効率的な再帰クエリを使用せずに)-アプリケーションレベルで並べ替えを行う必要があるため、もう一度お勧めします


また、1つの列は、書籍IDの並べ替えられたリストを格納する巨大なテキスト列になります。

お願い、それはやめて。1NFに違反することになり、データの一貫性やパフォーマンスなど、これを行わない理由は非常にあります(フィールドの一部を1回変更する場合は、フィールド全体を書き直す必要があります)。

于 2012-11-16T01:48:34.493 に答える
5

現在のソリューションは、複数のユーザー設定では機能しないようです。本の順序がBook表に設定されている場合、それはすべてのユーザーにとって永続的ではないでしょうか。

他の人が述べているように、通常はデータを正規化しておくのが最善です。これには、提案しているように別のテーブルを追加する必要があります。BookOrderingしたがって、新しいテーブルを作成できます。したがって、、、および列book_idがあります。そうすれば、すべてのユーザーとすべての本に割り当てられた位置があります。user_idposition

したがって、デフォルトの順序(このテーブルには保存されません)がありますが、ユーザーは順序を変更できます。テーブルはデフォルトからの変更のみを記録します。ユーザーの本をロードする場合は、最初にこのテーブルで特定のuser_idを確認してから、それに応じて順序をシフト/調整します。

于 2012-11-16T01:43:07.340 に答える
4

いくつかのSQLステートメントを使用して、例のこれらすべての行を更新することはそれほど難しくありません。DBMSで11,000の更新を実行する必要はありません(これはあなたが言おうとしていたことだと思います)。

まず、1つの位置にシャッフルされているすべての本を更新します。

UPDATE book
SET position = position + 1
WHERE position < 11000
AND position >= 1

...次に、移動する本の位置を設定します。

UPDATE book
SET position = 1
WHERE id = whatever
于 2012-11-16T01:44:11.307 に答える