バックエンドにはリレーショナル 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と同じ問題
したがって、この単純な問題に対する完全な解決策はないようです。あなたもそれに直面しましたか?どのようなアプローチを採用し、なぜそれが優れていたのですか?