2014-02-28 48 views
0

我正在寻找一个解决方案,反向工程的DB没有外键(真的!20岁的DB ...)。目的是完全做到这一点,而无需额外的应用程序或持久性逻辑,只需分析数据即可。 我知道这会有点困难,但应该是可能的,如果数据本身esp。也分析了PKs。反向工程的DB没有外键

回答

1

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

1

没有进攻,但如果这让你感到意外,你不可能在数据库中很长时间。

我打算假设通过“反向工程”,你只是想填充外键,而不是转向NoSQL或其他东西。这可能是一个有趣的项目。这里是我将如何去做:

看看所有的SELECT语句,看看如何连接到一个表。 20年前,这将是一个WHERE条款,但当然,它比这更复杂。使用相关的子查询和带有FROM子句的UPDATE语句,无论如何意味着某种连接。你必须能够弄清楚所有的事情。如果你想正式做到这一点(你可以直观地理解所有这些东西),你可以列出在表间连接中使用组合的次数。按成对表格列出它们,而不是连接中所有表格的集合。如果一方是主键,那么这些将是候选外键。另一方获得外键。有多列PK,但你可以弄清楚(所以如果主键的另一面在两个不是外键的表中)。如果一列最终指向两个不是合适的外键的不同表PK,但可能适合选择一个表并将其用作目标。

如果你还没有主键,你应该先做。索引,甚至是聚集索引(在Sybase/MSSQL中)并不总是正确的主键。无论如何,您可能必须相应地更改主键。

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

+0

没有冒犯,但你不能在_ETL_很长,如果_my question_惊讶你...... :-)我的意图是完全没有持久性逻辑,只通过分析表数据。所以这将是一个启发式的方法。任务是比较与主键相似的列数据。这应该适用于3NF中的数据,但如果模式处于2NF-时将会变得困难。但是,我认为我们可以用这种方法取得很大的进展,这也是为什么我不相信没有内置启发式工具的原因。 – Andreas

+0

ETL? ... :)你的问题并不让我感到惊讶。我多次想过同样的事情。 – albe