我正在寻找一种没有外键的逆向工程DB的解决方案(真的!一个20岁的DB ......)。目的是通过分析数据,在没有额外应用程序或持久性逻辑的情况下完全执行此操作。 我知道这有点困难,但如果数据本身特别是应该可行。还分析了PK。
答案 0 :(得分:1)
我不认为你的问题有通用的解决方案。希望有一些可以引导您的表/列的命名约定。您可以查询系统表以尝试查看正在发生的事情(Oracle:user_tab_columns,SQL Server:INFORMATION_SCHEMA.COLUMNS等)。祝你好运!
答案 1 :(得分:1)
没有冒犯,但如果你感到惊讶的话,你就不能长时间呆在数据库中。
我将假设通过“逆向工程”你只是想填写外键,而不是转向NoSQL或其他东西。这可能是一个有趣的项目。我将如何解决这个问题:
查看所有SELECT语句,看看如何对表进行连接。 20年前,这将是一个WHERE子句,但它当然比这更复杂。使用相关子查询和带有FROM子句的UPDATE语句以及任何意味着某种连接的连接。你必须能够解决所有问题。如果你想正式地做(你可以直观地说出所有这些东西),你可以列出表之间连接中使用组合的次数。通过成对表列出它们,而不是连接中所有表的集合。如果一方是主键,那些将是候选外键。另一方获得外键。有多列PK,但你可以解决这个问题(所以如果主键的另一面在两个不是外键的表中)。如果一列最终指向两个不同的表PK,这些表不是正确的外键,但是选择一个表并将其用作目标可能是合适的。
如果您还没有主键,则应首先执行此操作。索引,甚至是聚簇索引(在Sybase / MSSQL中)并不总是正确的主键。无论如何,您可能需要相应地更改主键。
收集所有陈述本身可能具有挑战性。您可以使用perl / awk从C / Java / PHP / Basic / COBOL程序中解析它们,或者您可以从监视输入到服务器来获取它们。您可能希望查找WHERE / JOIN / APPLY等而不是SELECT。还有很多其他方法。