如何有效地确定两个表是否相关?

时间:2016-11-17 08:49:11

标签: database composite-primary-key table-relationships autodiscovery

我有很多表对,我希望通过PK-FK关系有效地确定哪些表具有彼此相关的表。

  1. 如果记录了PK-FK关系,我将利用它,但我不能假设它总是记录在案。 (例如,如果源是平面文件等。)
  2. 如果没有记录,我需要一种方法来有效地确定这两个表是否相关。
  3. 如果配对中的表与非复合键无关,我将需要使用复合键。
  4. 我正在寻找的是以下内容之一:

    1. 任何现有算法。
    2. 任何研究论文。
    3. 任何想法/指示。
    4. 任何在线提供的类似作品。
    5. 书籍建议等。
    6. 例如:

      假设我有以下几对表:

      {Table1, Table2}
      {Table3, Table4}
      {Table5, Table6}
      

      还有更多......

      在上述对中,如果表Table3和Table4通过PK-FK关系彼此相关,我想返回对{Table3, Table4}。要返回正确的对,我需要一种有效的方法来确定表是否相关(假设关系没有记录)。

      注意:我正在寻找基于数据的表之间PK-FK关系的发现,而不仅仅是基于元数据的发现(因为在某些情况下元数据可能不可用)。

      非常感谢提前。

1 个答案:

答案 0 :(得分:0)

免责声明:我是一个这样的算法Linkifier的作者。 Linkifier根据元数据(如列名称及其数据类型的相似性)和列统计信息(如平均列宽度,以字节为单位)估计FK约束。

在说清楚之前,重要的是要注意FK约束识别通常是一个棘手的问题 - 有理由为什么DB不推断FK约束但用户必须提供它们。因此,不要指望估计值是100%准确的。

如果要在数据库中设置约束,则建议使用一般工作流程:

  1. 确保列具有合理的数据类型和名称。 DBLint可能有帮助。
  2. 如果数据库很小,请告诉数据库计算数据库中所有列的统计信息。这将提高PK和FK约束估计的准确性。但是,对大型复杂数据库进行统计计算可能需要相当长的时间。另一方面,统计数据不一定准确(根据所有数据计算) - 估计(基于数据的子样本)就足够了。请参阅数据库供应商的文档。
  3. 如果未在数据库中设置PK,请让Linkifier估算PK。查看估计值后,在数据库上执行生成的SQL alter查询。然后,真实PK的知识将提高FK约束估计的准确性,因为已知FK约束的一侧是正确的。警告:设置和执行PK可能非常耗时(特别是在大型事务表上)。
  4. 如果您已将PK添加到数据库中,请重新运行Linkifier以获取FK约束的实际估计值。
  5. 在仔细恢复FK约束估计值后,在数据库上执行生成的alter查询。警告:不鼓励将估计的FK约束盲目地应用于数据库,因为数据库实际上可以接受误报为有效。此外,设置和实施FK约束可能非常耗时。
  6. 如果您只想生成ER图,请从Linkifier导出估算值并使用yEd(ER图的合适布局算法为BPMN)或Oracle Data Modeler可视化它们。