根据我的经验,这些工具使用外键作为关系,我尝试它们的大多数数据库都不包含这些关系.当然,它们满足与外键相对应的约束,但不强制执行它们.而且我最终会得到一个由一堆不相关的表组成的“图表”.
所以我正在寻找的是可以计算“未声明的外键”的软件
>将它们用作数据库关系图中的表关系,或
>为相应的外键声明生成sql代码
你知道任何可以做到这一点的免费工具吗?
解决方法
我看到两种方法可以推断出这种关系.首先,请允许我说您的方法可能会因您使用的数据库而异.一些问题浮现在脑海中(我不想要答案,但值得反思)
>这些内部企业系统是否遵循一致的命名约定或模式?
>或者它们是否是您随时随地遇到的“野外”数据库?
>你准备做什么样的假设?
>您希望在结果中获得更多误报或漏报吗?
请注意,这种类型的推断几乎肯定会给出错误的结果,并且建立在很多假设之上.
所以我提供两种方法,我将在演唱会中使用.
通过结构/命名(符号分析)推断关系
通用数据库设计是在表名之后命名PK列(例如,表Customer上的CustomerId),或者将PK列命名为Id.
与另一个表具有FK关系的表通常将其相关列命名为与相关表相同.在Order表中,我期望CustomerId列引用Customer表中的CustomerId / Id列.
这种分析包括
>检查表格中的列以查找类似的短语/单词
>查找与其他表的名称类似的列名
>检查包含其他列名称的列名称(例如,FirstCustomerId& SecondCustomerId都引用Customer表中的CustomerId列)
通过数据推断关系(统计分析)
正如您建议在评论中所做的那样,查看数据将允许您确定“可能的”参考.如果Order表中的CustomerId列包含Customer表的Id列中不存在的值,那么可以合理地质疑这是一个有效的关系(尽管你永远不知道!)
一种简单的数据分析形式是使用日期和时间.彼此非常接近而创建的行更可能彼此相关.如果,对于创建的每个Order行,在几秒钟内也存在2到5个Item行之间,那么两者之间可能存在关系.
更详细的分析可能会查看使用值的范围和分布.
例如,如果Order表具有St_Id列 – 您可能会推断使用符号分析该列可能与State表或Status表相关. St_Id列有6个离散值,90%的记录由2个值覆盖. State表有200行,Status表有9行.您可以非常合理地推断St_Id列与Status表相关 – 它为表的行提供了更大的覆盖率(2/3的行是’used’,而State表中只有3%的行会被使用).
如果您对现有数据库进行数据分析以收集“真实数据”,我希望可以使用一些模式作为结构推理的指南.当具有大量记录的表具有重复多次的少量值的列(不一定按顺序)时,该列更可能与具有相应少量行的表相关.
综上所述