21

「順序付きリスト」をデータベースに保存して、更新(エントリの追加、削除、変更)を簡単に行えるようにするための最良の方法は何ですか?

ユーザーと映画のテーブルがあるデータベースについて考えてみます。各ユーザーには、お気に入りの映画のリストがあります。

多くのユーザーが同じ映画を好きになることができるので、ユーザーと映画を別々のテーブルにし、3番目のテーブルを使用してそれらを接続します。usermovies。

usermoviesには、ユーザーと映画のIDと「注文番号」が含まれています。注文番号は、ユーザー向けに映画のリストを注文するために使用されます。

たとえば、ユーザーJoshには次のリストがあります。

  1. プロメテウス
  2. メン・イン・ブラック3
  3. 独裁者

ユーザーのジャックは次のようなリストを持っている可能性があります。

  1. 独裁者
  2. プロメテウス
  3. 戦艦
  4. スノーホワイトとハンツマン

したがって、それらはいくつかのお気に入りを共有しますが、必ずしも同じ順序である必要はありません。

クエリを使用して、各ユーザーの映画IDのリストを取得できます。

SELECT movie_id FROM usermovies WHERE user_id =? ORDER BY order_number

次に、順序付けられたmovie_idsを使用して、別のクエリを使用して映画のリストを取得できます

SELECT name FROM movies WHERE id in (?,?,?) ORDER BY FIELD (id, ?,?,?)

したがって、クエリは機能しますが、リストの更新は非常に複雑になりました。ユーザーxの映画のリストを取得し、映画を追加し、削除し、リストの順序を簡単に変更できるように、この情報を保存するためのより良い方法はありますか?

4

4 に答える 4

8

「上に移動/下に移動」のような解決策を探しておらず、デフォルトでリストの一番下に追加する場合は、さらにいくつかのポインタがあります。

特定の位置への新しい行の挿入は、次のように実行できます:(位置3に挿入)

UPDATE usermovies SET order_number = ordernumber + 1 
   WHERE ordernumber > 3 and user_id = ?;
INSERT INTO usermovies VALUES (?, 3, ?);

同様の方法で削除できます:(位置6の削除)

DELETE usermovies WHERE order_numer = 6 and user_id=?;
UPDATE usermovies SET order_number = ordernumber - 1 
   WHERE ordernumber > 6 and user_id = ?;
于 2012-06-13T21:17:40.350 に答える
6

映画とユーザー間の関連付けの属性用の追加の列を持つジャンクション/リンクテーブルは、関連付けクラスとの多数の関連付けを実現するための標準的な方法です。したがって、行ったことは正しいように見えます。

挿入/更新/削除の容易さに関しては、挿入/更新/削除を実行するたびに、関連付け全体(ユーザームービーFKのすべての行)を管理する必要があります。これを行うための魔法の/簡単な方法はおそらくありません。

そうは言っても、トランザクションでこれらの操作を実行する必要があります。さらに重要なことに、アプリケーションがマルチユーザー対応の場合は、このジャンクションテーブルに「バージョン」列があります。

于 2012-06-13T07:02:36.130 に答える
4

ユーザーのお気に入りの映画を取得するには、単一のクエリを使用できます。

SELECT um.order_number, m.name FROM movies m
INNER JOIN usermovies um ON m.id = um.movie_id
WHERE um.user_id = ?
ORDER BY um.order_number

お気に入りの映画を追加/削除するには、usermoviesテーブル内の関連するレコードを追加/削除するだけです。
映画の順序を変更するには、ユーザーに関連するテーブルのすべてのorder_numberフィールドを変更するだけです。user_movies

于 2012-06-13T05:51:40.120 に答える
4

他の人が言ったことに加えて、ここで説明されているように、既存のお気に入りの並べ替えは単一のUPDATEステートメントで実行できます。

リンクされた回答は、2つのアイテムの並べ替えについて説明していますが、任意の数のアイテムに簡単に一般化できます。

于 2012-06-13T08:12:28.590 に答える