0

バックエンドにはリレーショナル DB (MySQL) があり、フロントエンドにはクールな BackboneJS があります。外部キーを介して相互接続されたいくつかのテーブル (BackboneJS 専門用語のモデル) があります。

問題

破壊がすべての子モデルに連鎖するように、特定のモデルを破壊するにはどうすればよいですか?

次の簡単なスキーマを検討してください。

PERSON
id
name

PHONE_NUMBER
id
person_id
number

EMAIL_ADDRESS
id
person_id
email

いくつかの電話番号と電子メール アドレスを持つ人物「Jack」が DB に保存されているとします。また、3 つのテーブルすべてに対して定義された BackboneJS モデル/コレクションがあり、データがそれらにロードされます。フロントエンドのユーザーは、ワンクリックで Jack のレコードを削除することにしました。

ここで、Jack のすべてのレコードを削除するいくつかの方法を示します。

アプローチ#1

Jack に関連する PhoneNumbers と EmailAddresses のすべてのモデルで「destroy」を呼び出してから、Jack 自体で「destroy」を呼び出します。

問題

  • 1 つのアクションに対する AJAX 呼び出しが多すぎます。
  • ユーザーは長時間待たなければなりません。(より多くの扶養家族、より多くの時間)
  • 削除は非トランザクションになります。途中でブラウザを閉じるとデータが壊れます。

アプローチ#2

データベース レベルで外部キー関係を定義し、PERSON 行が削除されたときに PHONE_NUMBER と EMAIL_ADDRESS がカスケード削除されるようにします。次に、フロントエンドでジャックの BackboneJS モデルを「破棄」します。

  • 依存関係の BackboneJS モデルは、バックエンドで対応するレコードに何が起こったのかを決して知りません。したがって、それらはそのまま残ります。

アプローチ#3

サーバー側アプリケーション「/thoroughly-delete-person」で URL を作成し (これにより、人をすべての依存関係と共に確実に削除します)、Jack で BackboneJS の Model#destroy を呼び出す代わりに、フロントエンドからそれを呼び出します。

  • アプローチ#2と同じ問題

したがって、この単純な問題に対する完全な解決策はないようです。あなたもそれに直面しましたか?どのようなアプローチを採用し、なぜそれが優れていたのですか?

4

1 に答える 1

2

私は同様の問題を抱えていました.1つの違いを除いて、アプローチ#2を使用しました。

可能であれば、とJackを含む単一のバックボーン モデルとして表します。モデルを他のバックボーン ビューに渡して、のモデル データを共有できます。その後、モデルを呼び出すことができます。phone_numberemail_addressJackJackdestroyJack

バックエンドで を使用したon delete cascadeので、クエリを作成するだけで済みました。

delete from PERSON where id = JACK_ID;

mysql の構文はわかりませんが、次のようなものです。

 PERSON
  id
  name

 PHONE_NUMBER
  id  references PERSON (id) on delete cascade
  person_id
  number

 EMAIL_ADDRESS
  id  references PERSON (id) on delete cascade
  person_id
  email

これがあなたの現在の問題のコンテキストにどの程度適合するかはわかりませんが、これは私がしたことと似ており、私にとってはうまくいきます.

于 2013-10-16T04:20:34.793 に答える