0

チェックボックスのリストへの変更をデータベースに保存するための最良の方法を探しています。これが私のセットアップです:

次のように、いくつかのデータベースエントリに基づいて、チェックボックスがオンまたはオフになっているチェックボックスのリストがあります。

Animals I like: 
0 Cats 
X Dogs
0 Birds
X Elefants

これで、ユーザーは自分の考えを完全に変更して選択Birdsおよび選択解除Dogsできるようになりました。この変更をできるだけ効率的にデータベースに保存したいと考えています。

データベースが構造化されている方法では、ユーザー テーブル (user_id を持つ) と動物テーブル (animal_id を持つ) があります。「いいね」はピボット テーブルで追跡されます (多対多の関係であるため)。

ここに私が検討したいくつかのアプローチがありますが、他の/より良い/より効率的なものに興味があります:

1) 保存時に、このユーザーのピボット テーブル内のすべてのエントリを削除し、チェックしたエントリのみを入力します。

これには、前後の選択肢の多くを比較する必要がないという利点があります。欠点は、変更されていないエントリ (つまり、上記の例ではエレファント) を削除することです。たとえばエレファントのような作成タイムスタンプを付けると、その選択を変更しなくても毎回変更されます

2) 保存時に、データベースにクエリを実行して、すべてのオリジナルのいいね! のリストを取得します。このリストを新しいお気に入りと比較します。新しいリストにない元のいいねに遭遇するたびに、それを削除します。元のリストにない新しい類似品に遭遇した場合は、追加します。

これには、データベースへの変更のみを変更するという利点がありますが、非常に多くのクエリのようです。動物のリストが長く、多くの変更が加えられた場合、ループによって多くのデータベース トランザクションが発生する可能性があります。

したがって、この問題を解決するためのベスト プラクティスは何でしょうか。つまり、これは一般的な問題であるに違いなく、ここで車輪の再発明をしたくありません。

4

2 に答える 2

1

オプション1が最適ですが、タイムスタンプを乱したくないため、「各レコードを個別にチェックする」よりも効率的なシステムを実行できます。

1) データベース $original からユーザーの選択肢のリストを取得します。

2) 送信されたフォーム $submitted から選択肢のリストを取得します。

3) array_diff() を使用して、何が変更され、データベースに対して何をする必要があるかを把握します。

例えば

$original = array(2,4,6,8);
$submitted = array(4,7,8);
// so 2 and 6 have been removed, and 7's been added.

$unchanged = array_intersect($original, $submitted); // 4, 8
$removed = array_diff($original, $submitted); // 2, 6
$added = array_diff($submitted, $original); // 7

$sql = "DELETE FROM pivot_table WHERE animal_id IN (2, 6);"; // remove 2&6
$sql = "INSERT INTO (animal_id, ...) VALUES (7, ...)"; // insert 7
于 2013-01-24T20:22:09.347 に答える
0

最初に選択肢をユーザーに提示するとき、データベースクエリを実行して、ユーザーが既にチェックしたものを表示しました。これで、元の変更と比較できます。何かが変更された場合は更新し、そうでない場合はそのままにしておきます。

于 2013-01-24T19:37:01.230 に答える