MySQLデータベースをバイナリファイルにバックアップするコードを書いています。私は知ってmysqldump
いますが、いくつかの理由で簡単な方法を使用できません。私が現在していること:
- スキーマ定義を読む
- 外部キーの依存関係でテーブルを並べ替える
- すべてのテーブルの行を選択し(毎回100行)、バイナリファイルに書き込みます
依存関係の定義:テーブルは、のキーを指す外部キーが少なくとも1つある場合にのみT1
、テーブルの存在に依存します。T2
T1
T2
各テーブルには数値が割り当てられます。この値は、テーブルの順序を指定します。依存関係のないテーブルの場合、この値は0
、現在のテーブルが依存しているテーブルの最大値です。一を足す。-1
依存テーブルの値のセットにが存在する場合、現在のテーブルの値は未定義のままです( -1
)。すべてのテーブルの最初の値は、-1
指定されていないことを意味します。
これはC++コードです:
// tablesQueue: Queue of all tables
// orderedQueue: Resulting order
while(! tablesQueue.isEmpty())
{
bool satisfied = true;
foreach(TableNode* parent, tablesQueue.head()->referencedTables)
{
if(parent->degreeOfFreedom == -1)
{
satisfied = false;
break;
}
else
// handle error blah blah ...
}
if(satisfied)
{
int max =0;
foreach(TableNode* parent, tablesQueue.head()->referencedTables)
max = (max < parent->degreeOfFreedom+1) ?
parent->degreeOfFreedom+1 : max;
tablesQueue.head()->degreeOfFreedom = max;
orderedQueue.enqueue(tablesQueue.dequeue());
}
else
{
tablesQueue.enqueue(tablesQueue.dequeue());
}
}
テーブルの依存関係グラフにサイクルがある場合、このアルゴリズムは終了しません。
通常、これはテーブルのそのようなデザインを持っていても大丈夫ですか?たとえば、相互に外部キーを持つ2つのテーブル。驚いたことに、Oracle for MySQL()が提供するサンプルデータベースにはsakila
、このようなサイクルがたくさんあることがわかりました。3番目のテーブルを追加することで、そのすべてのサイクルを削除できると思います[?]