2012-06-13 17 views
14

「注文リストの追加、削除、および変更を簡単に行うことができるように、データベース内に「注文リスト」を保存する最良の方法は何ですか?注文リストをデータベースに保存する最も良い方法は?

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

多くのユーザーが同じ映画を好きなので、私はユーザーとムービーを別々のテーブルにし、3つ目のテーブルを使用してusermoviesを接続しました。

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

  1. プロメテウス
  2. ブラック3
  3. 男性ジャックは次のようにリストを持っているかもしれません

とユーザー独裁者:

は例えば、ユーザージョシュは、以下のリストを持っているかもしれません

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

だから、彼らは必ずしも必要ではないが同じ順序で、いくつかのお気に入りを共有します。

私は、クエリを使用して、各ユーザーのための映画のIDのリストを取得することができます。注文したmovie_idsで、私は別のクエリ

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

を使用して映画のリストを取得することができ、その後

SELECT movie_id FROM usermovies WHERE user_id =? ORDER BY order_number 

をクエリーは機能しますが、リストを更新するのは本当に複雑です。この情報を保存して、ユーザーxのムービーのリストを取得したり、ムービーを追加したり、削除したり、リストの順序を変更したりするのは簡単です。単にusermoviesテーブル内の関連レコードを削除/追加/削除の好きな映画を追加するには

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 

:あなたは、単一のクエリを使用することができ、ユーザのお気に入りの映画を取得するに

+0

あなたが使用できるユーザーのすべての映画を取得するにはa 'SELECT name FROM movies INNER JOIN usermovie ON usermovie.movi​​e_id = movies.id AND usermovie.user_id =? ORDER BY usermovie.order_number'。現在のアプローチでは何が難しいか分かりません。ユーザーにムービーを追加するには、単にリンクテーブルに新しいエントリを挿入し、それを削除するだけでエントリを削除します。 – Cyclonecode

+0

ありがとう!それは便利ですが、私の本当の問題は更新です。 – wannabeartist

答えて

5

ムービーとユーザーの関連付けの属性に追加の列があるジャンクション/リンクテーブルは、関連クラスとの多対多の関連付けを実現するための標準的な方法です。

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

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

+0

実際には*すべての行の代わりに1行だけを変更してタスクを実行する "魔法の"方法:http://stackoverflow.com/a/3399334/2947812 –

3


ムービーオーダーを変更するには、ユーザーに関連するuser_moviesテーブルのorder_numberフィールドをすべて変更するだけです。

+0

ありがとう、 私はまだ変更を処理する方法がわかりません:たとえば、最初のムービーを削除することは、他のすべてのムービーの注文番号を変更することを意味しますか? – wannabeartist

+0

@wannabeartist:はい、確かに – Marco

+0

個々の行を更新するのではなく、更新時にリストを再作成することは理にかなっていますか? たとえば、ユーザーxが自分のリストを取得し、変更してヒット "保存" - > 1.前のエントリを削除します。 2.新しいエントリが1つの行に挿入されます – wannabeartist

4

他の人が述べたことに加えて、既存のお気に入りの並べ替えは、hereで説明されているように、1つのUPDATE文で行うことができます。

リンクされた回答は2つの項目の並べ替えを説明していますが、任意の数の項目に簡単に一般化できます。具体的に新しい行を挿入

3

すると、あなたが「上に移動/下に移動」ちょっとソリューションを探して、その後、リストの一番下に追加することをデフォルトされていない場合は、ここではさらにいくつかのポインタであります位置は次のように行うことができます。(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 = ?;