【问题标题】:Reverse Engineering of a DB without foreign keys没有外键的数据库的逆向工程
【发布时间】:2014-02-28 17:09:57
【问题描述】:

我正在寻找一种对没有外键的数据库进行逆向工程的解决方案(真的!一个 20 岁的数据库......)。这样做的目的是完全不需要额外的应用程序或持久性逻辑,只需分析数据即可。 我知道这会有些困难,但如果数据本身特别是可能的话。 PK 也会被分析。

【问题讨论】:

    标签: sql database foreign-keys reverse-engineering


    【解决方案1】:

    我认为您的问题没有通用的解决方案。希望有某种可以引导您的表/列的命名约定。您可以查询系统表来尝试了解发生了什么(Oracle:user_tab_columns,SQL Server:INFORMATION_SCHEMA.COLUMNS 等)。祝你好运!

    【讨论】:

      【解决方案2】:

      我也不认为你会找到一个通用的解决方案......但我想建议你一种方法,特别是如果你没有任何可以阅读的源代码来指导你映射:

      首先扫描数据库中的所有表。使用扫描,我的意思是存储表名和列。 您可以假设列类型尝试将数据转换为特定格式(开始尝试转换为日期、数字、布尔值等)...您还可以尝试通过分析其内容来发现数据类型(如果它只有数字而没有浮点数,如果它有带斜线的数字,如果它有长文本或短文本,如果它只有一个数字......等等)。

      映射完所有表后,首先比较具有数字类型的所有列的内容。 (为什么?如果数据库是由人类设计的……那么他/她/他们可能会使用数字作为主键/外键)。

      每次您在 2 个不同表的 2 列内容之间找到超过 X 个成功对应关系时,记录此连接。 (这个 X 因素取决于您拥有的记录数量...)

      必须为每个表运行此分析,比较所有其他表...逐列 - 所以...这需要一些时间...

      当然,这是对需要做什么的概述,但并不是要编写复杂的代码……

      祝你好运,如果你找到任何工具来做到这一点,请告诉我! :-)

      【讨论】:

      • 真是个好主意,我会尝试检查是否有人已经在github上实现了这个
      • 只是为了完成我的建议:当我提到“记录此连接”时......您可以对找到的每个关系进行投票。程序结束后......只需分析最受好评的关系
      【解决方案3】:

      无意冒犯,但如果这让您感到惊讶,您不可能在数据库中呆很长时间。

      我将假设通过“逆向工程”您只是想填写外键,而不是转移到 NoSQL 或其他东西。这可能是一个有趣的项目。以下是我的做法:

      查看所有 SELECT 语句并了解如何对表进行连接。 20 年前,这将在 WHERE 子句中,但它当然比这更复杂。使用相关的子查询和带有 FROM 子句的 UPDATE 语句以及任何暗示某种连接的东西。你必须能够弄清楚这一切。如果你想正式地做这件事(你可能可以直观地了解所有这些东西),你可以列出在表之间的连接中使用组合的次数。按表对列出它们,而不是连接中所有表的集合。如果一侧是主键,那将是候选外键。另一方得到外键。有多列 PK,但您可以弄清楚(因此,如果主键的另一侧在两个不是外键的表中)。如果一列最终指向两个不同的表 PK,这也不是正确的外键,但可能适合选择一个表并将其用作目标。

      如果您还没有主键,您应该先这样做。索引,甚至可能是聚集索引(在 Sybase/MSSQL 中),并不总是正确的主键。在任何情况下,您都可能需要相应地更改主键。

      收集所有陈述本身可能具有挑战性。您可以使用 perl/awk 将它们从 C/Java/PHP/Basic/COBOL 程序中解析出来,或者您可以通过监视服务器的输入来获取它们。你会想要寻找 WHERE/JOIN/APPLY 等而不是 SELECT。还有很多其他方法。

      【讨论】:

      • 无意冒犯,但如果 my question 让你感到惊讶,你不可能在 ETL 中待很长时间...... :-) 我的意图是完全没有持久化逻辑,只需要分析表数据就可以做到这一点。所以这将是一种启发式方法。任务是比较列数据与主键的相似性。这应该适用于 3NF 中的数据,但如果架构在 2NF- 中,则会变得困难。但是,我认为我们可以通过这种方法走得很远,这也是为什么我不能相信没有内置启发式的工具。
      • ETL? ... :) 你的问题并不让我感到惊讶。我曾多次想过同样的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 2017-05-05
      • 2023-03-24
      • 1970-01-01
      • 2010-10-14
      • 2011-12-21
      • 2016-01-20
      相关资源
      最近更新 更多