6

ディレクトリとファイルのファイルシステム階層を保存しています。

innodb テーブルでは、各ディレクトリ/ファイルの詳細を保存し、削除時にカスケードする外部キー制約を使用して親子関係を維持します。

myisam テーブルは、全文検索でこれらのディレクトリ/ファイルを検索するために使用されます。各行の名前と ID が含まれています。

データ テーブル (innodb テーブル) 内のすべての行は、検索テーブル (myisam テーブル) 内に対応する行を持ち、データ テーブルから行を追加または削除すると、検索テーブルに反映される必要があります。

親ディレクトリを削除するときに、2 つのテーブル間のデータの一貫性を維持するための最適なソリューションを見つけようとしています。innodb テーブルは問題ありません。親を削除すると、子がすべて削除されるまで削除がカスケードされます。myisam テーブルから対応する行を削除するのはより困難です。

私が最初に考えたのは、innodb テーブルで on-delete トリガーを使用することでした。行が削除されると、対応する行が myisam テーブルから削除されます。ただし、MySQL はカスケード削除中にトリガーをアクティブ化しないため (7 年間の既知のバグで、マニュアルでサポートの欠如を言及することで修正されました)、それはオプションではありません。

私の 2 番目の考えは、親子関係を検索テーブルに入れることでしたが、これは全文検索機能をサポートするための myisam テーブルであるため、外部キー制約をサポートしていません。

innodb が全文検索をサポートするようになったと聞いていたので、検索テーブル エンジンを変更できるのではないかと考えましたが、ラボ リリースでしか利用できません。

私の最後の考えは、外部キー制約を放棄し、トリガーのみを使用してデータの一貫性を維持することでした。削除時に、parent = OLD.id である innodb と myisam テーブルの両方から削除します。ただし、テーブル内のすべてのデータを破損する可能性のある無限ループを防ぐために、MySQL は、トリガーをアクティブ化した同じテーブル内のデータの操作をサポートしていません。

リクエストのループを通じて、親ディレクトリの下にあるすべての子をプログラムで取得することに頼りましたが、より良いオプションが必要だと感じています。より効率的な他の回避策はありますか?この時点で、私が考えることができる唯一の 2 つのオプションは、上記のアプローチのいずれかが修正されるのを待つか、カスケード削除からのトリガーの起動をサポートする PostgreSQL のような別の RDBMS に変更することです。

他のアイデアは大歓迎です。

4

1 に答える 1

1

この種の頭痛の種は、私が可能な限り mysql から離れた理由です。

...もっと良い選択肢が必要だと思います...

残念ながらありません。単純な問題は、cascade を削除することができず、mysql に何を削除したかを認識させることができないことです。したがって、唯一のオプションは、削除する前に何を削除しようとしているのかを見つけることです(これは、最後に提案したアルゴリズムです)。

カスケードはデータを破損するため、on update cascadeキーを使用しないでください。子ディレクトリを削除せずに親ディレクトリを削除しようとすると失敗します。

面倒な作業 (削除) を行う手順を作成することをお勧めします。これにより、すべてのディレクトリを再利用するため、アプリと DB の間の大きな IO が防止されます。Iy は、別のアプリを介して同じデータベースにアクセスする場合 (または手動で何かをしたい場合) に、そのための共通コードも提供します。

最初に述べたように、最近は主に postgresql を使用しています。これはその理由の一例です。

于 2012-05-19T15:05:39.253 に答える