1

データベースに保存されているアイテムのリストがあります。各アイテムには、id 列、タイトル、および位置列 (int) があります。

デフォルトでは、ユーザーが新しいアイテムをリストに追加するたびに、その ID がその位置に配置されます。したがって、ID が 1、2、3 の 3 つのアイテムがある場合、それらの位置も 1、2、3 になります。

次に、位置をフェッチするときにORDER BY position ASC、SQL クエリ内で行います。

問題は、ユーザーが既存のアイテム内のどこにでも新しいアイテムを追加できる機能を望んでいることです。

したがって、アイテム 1、2、3 の位置が 1、2、3 の場合、彼は新しいアイテムを位置 2 に追加することを選択できます。これにより、アイテム 1、2、3、4 の位置が 1 3 になります。 4 2

したがって、アイテム # 4 は位置 2 に置かれ、アイテム # 2 と 3 は位置 3 と 4 に押し下げられます。

この挿入を達成するための最も簡単で効率的なアルゴリズムは何ですか?

4

1 に答える 1

3

コードの観点から見た最も簡単な方法は、順序値ではなく次の要素 ID を持つ連結リスト スタイルを使用することです。これは小さなリストではあまり役に立ちませんが、リストのサイズを大きくし始めると、更新/移動/削除がよりクリーンになり、数千のタプルを更新して 1 つの順序変更を行うことができなくなります。

++ 手元に正確なコード例はありませんが、ユーザーのすべてのリストを呼び出すことができます

SELECT Posts.id, Posts.next, Posts.content, User.firstPost FROM db.posts AS Posts 
JOIN db.user as User ON Posts.ownerid = User.id 
WHERE User.id='123' AND Posts.active = 1;

これにより、1 人のユーザーのすべての投稿が取得され、次の投稿の ID を含むフィールドが作成されます。開始するには、最初の投稿を識別するためのキーが必要です (最初の投稿の ID をユーザーの情報に保存します)。最初の投稿を取得したら、その「次の」値を取得し、それを使用して次の投稿を識別します。

これは短いリストとしては少しクレイジーに思えますが、1000 件の投稿があるユーザーについて考えてみてください。2 番目の位置に 1 つの投稿を追加する必要がある場合。従来の数値順序付けシステムでは、+1 更新で他の 999 行を更新する必要があります。このソリューションでは、投稿を 2 番目の位置に挿入する必要がある場合、最初の投稿をクエリして次の値を取得するだけです。それを取得したら、それを新しい 2 番目の投稿の値に変更し、2 番目の投稿の次の値を最初の投稿が最初に保持していた値に設定します。

[1st Post] --Next---> [2nd Post] --Next---> [3rd Post]

挿入後:

[1st Post] -.                          .--> [2nd Post] --Next---> [3rd Post]
            `--Next--> [New 2nd Post]--`
于 2012-08-30T22:19:57.403 に答える