2012-05-15 11 views
6

ディレクトリとファイルのファイルシステム階層を格納しています。同時にデータテーブルと検索テーブルのカスケード削除

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

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

データテーブル(innodbテーブル)のどの行も検索テーブル(myisamテーブル)に対応する行を持ち、データテーブルの行の追加または削除を検索テーブルに反映する必要があります。

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

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

私は、検索テーブルに親子関係を置いていましたが、フルテキスト検索機能をサポートするのはmyisamテーブルなので、外部キー制約はサポートされていません。

私はinnodbが全文検索をサポートするようになったので、検索テーブルエンジンを変更できると思ったが、実験室でのみ利用できると思った。

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

私は親ディレクトリの下のすべての子をプログラムの要求ループで取得することに頼っていましたが、より良い選択肢があるはずです。 もっと効率的な方法はありますか?私が考えることができる唯一の2つのオプションは、上記のアプローチの1つが修正されるのを待っているか、カスケード削除からトリガを起動するPostgreSQLのような別のRDBMSに変更することです。

他のアイデアをいただければ幸いです。

+0

2つのテーブル間の関係について、私はかなり混乱しています。お互いに異なるタイプの2つのテーブルの間の関係を定義することです。私は以前これを試して、データの一貫性を維持する際に問題が発生しました。もし、外部キーとプライマリキーのユーザーとのテーブル関係を通じてデータの一貫性を維持したい場合は、関係を定義するすべてのテーブルでinnodbを使用します。 –

+0

検索テーブル(myisam)がデータテーブル(innodb)の検索エンジンとして使用されています。しかし、サブディレクトリとファイルを持つディレクトリが削除されると、変更はデータテーブルと検索テーブルの両方に反映される必要があります。全文検索がサポートされていないため、検索エンジンにinnodbを使用することはできません(少なくとも、当時)。リレーションシップはデータテーブルでうまく定義されますが、削除は検索テーブルに反映されません。 – JayceTDE

+0

+1よく書かれた質問;残念ながら私はあなたの現在のアプローチに代わるものは見当たりませんが、他の誰かが何かを思いつくでしょう – Daan

答えて

1

これらの頭痛は、私が可能な限りmysqlから離れるようにしたものです。

...私は

は悲しいことがありません...良いオプションがあるように持っている感じ。簡単な問題は、カスケードを削除できず、mysqlが削除したばかりのものを知ることができないことです。あなたの唯一の選択肢は、その前に削除しようとしているものが見つかることです(これは最後に提案したアルゴリズムです)。

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

私はあなたのために重い持ち上げ(削除)を行う手順を作成することをお勧めします。これは、あなたのアプリとDBとの間の大規模なIOがすべてのディレクトリを通じて再利用されるのを防ぎます。また、別のアプリケーションから同じデータベースにアクセスする場合(または手動で何かを実行したい場合)、共通コードを提供します。

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

関連する問題