gpt4 book ai didi

database-design - 在关系数据库中可以有循环外键依赖吗?

转载 作者:行者123 更新时间:2023-12-04 19:11:14 24 4
gpt4 key购买 nike

我正在编写将 MySQL 数据库备份到二进制文件的代码。我知道 mysqldump但由于某些原因,我不能使用琐碎的方法。我目前在做什么:

  • 读取架构定义
  • 按外键依赖性对表进行排序
  • 选择所有表中的行(每次 100 行)并将它们写入二进制文件

  • 依赖的定义:一张表 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());
    }
    }

    如果表的依赖图中存在循环,则该算法不终止。

    通常情况下,对表格进行这样的设计可以吗?例如,两个表彼此具有外键。令人惊讶的是,我发现 Oracle 为 MySQL 提供的示例数据库( sakila )有很多这样的循环。我假设可以通过添加第三个表来删除所有循环 [?]

    最佳答案

    循环依赖是相当普遍的。一些例子:

  • 实现 "adjacency list" 时,表引用自身等级制度。
  • 实现 1:1* 关系时,两个表相互引用。
  • 两个相互引用的表是 1:N 关系的可能实现之一(其中“N”端的行之一是“特殊的”)。
  • 此外,我见过多个表形成“环”的情况...

  • 所以是的,拥有循环依赖是“可以的”。

    * 严格来说,真正的 1:1 需要延迟约束来解决鸡和蛋问题(MySQL 不支持),否则只能有 1:0..1 或 0..1:0..1 .但在所有这些情况下,您有两个相互引用的表。

    关于database-design - 在关系数据库中可以有循环外键依赖吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14791309/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com