我在写代码来将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