我在寫代碼來將MySQL數據庫備份到二進制文件中。我知道mysqldump
,但由於某些原因,我不能使用微不足道的方法。什麼我目前做:可以在關係數據庫中使用循環外鍵依賴關係嗎?
- 讀取架構定義的外鍵依賴
- 排序表
- 所有表中選擇行(每次100行),並在二進制文件中寫
相關性的定義:表T1
取決於表T2
的存在當且僅當至少在指向T2
的密鑰的T1
中有一個外鍵。
將數值分配給每個表。該值指定表格的順序。對於不依賴的表格,這個值爲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());
}
}
如果在表中的依賴圖一個週期,該算法不會終止。
通常情況下可以有這樣的表格設計嗎?例如兩個表彼此具有外鍵。令人驚訝的是,我發現Oracle爲MySQL提供的示例數據庫(sakila
)有很多這樣的週期。我假設可以通過添加第三個表來刪除所有的循環[?]
只要循環中至少有一個允許爲空的鏈接(即_not_聲明爲「NOT NULL」),我就不會看到循環外鍵依賴性的問題。 – 2013-02-09 20:39:35
@IanRoberts當您嘗試將所有數據寫入文件並再次恢復時,會出現問題。假設你正在讀取你行備份文件中'n'行的數據。它依賴於'B'中相應行的存在;說行號'm'。你需要在'A'的第n行之前寫下'm'行。但是,如果'm-i'行的'B'有一個指向'A'的第n + j個鍵的鍵,那麼你沒有有效的表順序來恢復你的數據庫。 – 2013-02-09 20:49:07